Django 용어 정리

Sawol·2021년 6월 24일
0

django

목록 보기
5/5
post-thumbnail

마이그레이션(migration)

데이터베이스에 적용시켜야 하는 변화에 대한 기록.
웹에 어떤 것을 추가했다면 데이터베이스에도 적용해야함.
이를 '마이그레이션 해야한다' 라고 표현.
데이터베이스와 관련된 사항에 변경이 되었다면 항상 마이그레이션을 수행해야 적용됨.

  • makemigerations은 업데이터 해야할 사항들이 기록된 파일 생성.
  • migrate 기록된 파일에 적혀있는 사항들을 실제로 적용.

장고는 새 프로젝트를 생성할 때 데이터베이스에 기본적으로 필요한 테이블을 미리 마련해두기 때문에 새 프로젝트를 생성한 뒤 runserver 명령어를 사용하면 마이그레이션이 필요하다는 경고문이 뜬다.

auto_now VS auto_now_add

  • auto_now_add
    추가한 시간을 기록. 그 후 수정되지 않음.
    즉, 생성시간을 표현할 때 적합함.
  • auto_now
    모델이 수정될 때마다 그 시간을 기록. 계속 수정됨.
    즉, 수정시간을 표현할 때 적합함.

Reference

MTV

장고에서 사용하는 디자인 패턴.

  • Model
    db에 저장되는 데이터.
    하나의 클래스가 하나의 테이블이다.
    장고는 ORM을 지원하기 때문에 파이썬으로 데이터베이스를 조작할 수 있다.
  • Template
    사용자에게 보여지는 화면.
    다만, 장고에서 html 파일은 정적인 파일이 아니다. 템플릿 언어를 사용하여 동적으로 동작하기 때문이다. 장고에서의 정적인 파일은 css, js이다.
    그래서 장고에서 css, js 파일을 사용하기 위해서는 html 파일에 {% load static %}를 추가해 정적 파일을 사용하겠다고 선언 해야한다.
  • View
    요청에 따른 로직을 수행하여 결과를 템플릿으로 응답한다.

FBV와 CBV

뷰 페이지를 만들 때 사용하는 방식.

  • FBV(Function based view)
    함수를 기반으로 뷰 로직을 구현한다.
    원하는 기능을 담은 함수를 직접 구현할 수 있는 장점이 있다.
  • CBV(Class based view)
    장고가 제공하는 클래스를 활용해 뷰 로직을 구현한다.
    장고는 웹 개발시 자주 사용하는 것들을 미리 클래스 형태로 만들어 제공한다.

CBV로 뷰를 구성하기

CBV로 뷰 페이지를 구성할 때 사용하는 클래스는 아래와 같다.
이 클래스를 뷰에 상속 받아 사용하면 된다.

  • ListView
    포스트를 나열하고 싶으면 사용하는 클래스.
  • DetailView
    상세페이지를 만들 때 사용하는 클래스.

모델명 뒤에 _list가 붙은 html 파일을 기본 템플릿으로 사용한다. 즉, Post 모델의 기본 템플릿은 post_list.html이다.
그래서 템플릿을 생성할 때 이러한 규칙을 지켜줘야하며 다른 이름을 사용하고 싶은 경우에는 template_name을 사용하여 템플릿 명을 명시해줘야 한다.
템플릿에서 뷰의 오브젝트들은 따로 선언하지 않아도 post_list로 받아진다.

장고에서 테스트

  • 테스트가 시작되면 새로운 테스트용 빈 데이터베이스를 생성함
  • 단, 데이터베이스에 테스트 파일에서 setUp 함수에서 설정한 요소는 포함시킴

sr-only

  • 설정한 내용은 화면에 나오지 않고 스크린 리더로만 읽을 수 있음
  • 스크린 리더는 화면에 나타나는 정보를 음성으로 출력해주는 프로그램

다대일 관계(1:N) - Foreignkey

  • 게시글 당 하나의 태그를 가질 수 있는 경우
  • 게시글에 여러 댓글이 달리는 경우
  • class Foreignkey(to, **options)

삭제 옵션

  • on_delete=models.CASCADE
    외래키가 바라보는 테이블의 값이 삭제될 때 해당 필드 또한 함께 삭제됨
  • on_delete=models.SET_NULL
    외래키가 바라보는 테이블의 값이 삭제될 때 해당 필드는 빈칸으로 둠
    null=True를 설정해야 사용 가능
  • on_delete=models.PROTECT
    외래키 필드가 함께 삭제되지 않도록 오류 발생(ProtectedError)
  • on_delete=models.SET(func)
    외래키 필드가 func을 수행
  • on_delete=models.SET(func)
    아무 행동을 하지 않음

상대 모델에 접근

# N -> 1 : 댓글에서 게시글로 접근
comment.post

# 1 -> N : 게시글에서 댓글로 접근
post.comment_set

다대다 관계(N:N) - ManyToManyField

  • 인스타그램의 해시태그처럼 게시글 당 여러개의 태그를 가질 수 있는 경우
  • class ManyToManyField(to, **options)
  • 기본적으로 null=True가 설정되어 있음
    태그 하나가 디비에서 삭제된다고 연결된 게시글이 모두 삭제되면 안되기 때문.

Meta 클래스

  • 모델에 몇 가지 옵션(메타 데이터)이 첨부 된 클래스
  • 사용 가능한 권한, 관련 데이터베이스 테이블 이름, 모델이 추상인지 여부, 이름의 단 복수 버전 등을 정의

null=Trueblank=True의 차이

  • null=True
    데이터베이스에 null 값을 허용. 데이터베이스에 null로 저장됨
  • blank=True
    폼(입력양식)에 빈값이 들어가는 것을 허용. 데이터베이스에는 ''로 저장됨

null=True 일때 폼이 빈 값이면 오류 발생

category = models.ForeignKey(Category, null=True, on_delete=models.SET_NULL)

blank=True를 추가하면 빈 값 입력가능

category = models.ForeignKey(Category, null=True, blank=True, on_delete=models.SET_NULL)

셀 플러스(shell plus)

  • 장고의 기본 셀은 가독성도 좋지않고 불편함
  • 셀 플러스를 이용하면 코드에 따라 글자 색상도 다르게 표현되어 가독성이 높아짐
  • for문 등을 사용할 때 들여쓰기도 자동으로 맞춰줌
  • 여러 모델을 자동으로 임포트 해줌

설치 방법

pip install django_extensions
pip install ipython

프로젝트에 적용

# settings.py
INSTALLED_APPS = [
	...
'django_extensions',

]

get_context_data

  • ListViewDetailView 클래스는 기본적으로 get_context_data 메서드를 내장함
  • ListView를 상속받은 클래스에서 model=Post라고 선언하는 것은 post_list=Post.objects.all()과 동일
  • 그래서 post_list.html에서 {% for p in post_list %}와 같은 명령어를 바로 사용할 수 있는 것임

csrf_token

  • 장고에서 form을 사용할 때 csrf 공격을 방어해주는 기능
  • {% csrf_token %} 으로 사용
  • form을 생성하면 꼭 사용해줘야 함
  • 장고에서는 form 안에 무작위의 토큰을 input 값으로 부여하고 나중에 서버에 POST로 들어온 값이 그 토큰 값과 일치하는지 확인 과정을 거침
  • {% csrf_token %}를 사용하지 않으면 403 Forbidden 발생

LoginRequiredMixin

  • 장고에서 제공하는 로그인을 했을 때만 정상적인 페이지가 보이도록 하는 기능
  • 클래스의 매개변수로 해당 클래스를 입력하면 사용 가능
  • Mixin(다중상속)
    클래스에서 Mixin을 사용하면 다른 클래스의 메서드를 추가할 수 있음

form_valid() 함수

  • CreateView 클래스에서 제공하는 함수
  • 사용자가 폼에 제대로 내용을 입력하면 이 함수가 자동으로 호출됨
  • 사용자가 작성한 내용을 사용해 포스트를 만들고 경로로 보내줌(redirect)
  • 이 함수를 재정의하면 기능을 확장할 수 있음

dispatch() 함수

  • CBV에서 제공하는 메서드
  • 방문자가 웹사이트에 GET 방식으로 요청했는지 POST 방식으로 요청했는지 판단하는 기능
  • ex) GET 방식으로 요청하면 포스트를 작성할 수 있는 페이지를 보내줌.
    같은 경로로 POST 방식으로 요청하면 데이터베이스에 내용을 저장함.

django-crispy-forms

  • 못생긴 폼을 심플하게 바꿔주는 외부 라이브러리
  • 사용 방법
# 사용하려는 템플릿 상단에 {% load crispy_forms_tags %}
{% load crispy_forms_tags %}
# form에 crispy 적용
{{ form | crispy }}

django-markdownx

  • 마크다운을 적용할 수 있게 해주는 외부 라이브러리
  • 사용 방법
# models.py
from markdownx.models import MarkdownxField

class MyModel(models.Model):
    myfield = MarkdownxField()

# post.html
<form method="POST" action="">{% csrf_token %}
    {{ form }}
</form>

{{ form.media }}		# 이 줄만 추가하면 됨
  • 게시글을 작성하면 실시간으로 아래에 마크다운 적용된 화면을 보여준다
  • 적용 모습
  • html 이스케이핑을 방지하기 위해 safe를 사용해야함

    HTML 이스케이핑
    텍스트를 HTML로 변환할 때 이 문법은 HTML 문법이 아니라 텍스트 라는 것을 구분지어주기 위해 < 이러한 기호를 &lt로 바꿔주는 것.
    &lt 와 같은 요소를 HTML 엔티티라고 함.
    장고는 자동으로 HTML 이스케이핑을 수행하기 때문에 마크다운을 사용시 이스케이핑을 하면 안 된다고 알려야함.
    이때 사용하는 것이 safe.

  • 자세한 내용은 여기 참고

django-allauth

0개의 댓글