데이터베이스에 적용시켜야 하는 변화에 대한 기록.
웹에 어떤 것을 추가했다면 데이터베이스에도 적용해야함.
이를 '마이그레이션 해야한다' 라고 표현.
데이터베이스와 관련된 사항에 변경이 되었다면 항상 마이그레이션을 수행해야 적용됨.
makemigerations은 업데이터 해야할 사항들이 기록된 파일 생성.migrate 기록된 파일에 적혀있는 사항들을 실제로 적용.장고는 새 프로젝트를 생성할 때 데이터베이스에 기본적으로 필요한 테이블을 미리 마련해두기 때문에 새 프로젝트를 생성한 뒤
runserver명령어를 사용하면 마이그레이션이 필요하다는 경고문이 뜬다.
장고에서 사용하는 디자인 패턴.
{% load static %}를 추가해 정적 파일을 사용하겠다고 선언 해야한다.뷰 페이지를 만들 때 사용하는 방식.
CBV로 뷰 페이지를 구성할 때 사용하는 클래스는 아래와 같다.
이 클래스를 뷰에 상속 받아 사용하면 된다.
모델명 뒤에
_list가 붙은 html 파일을 기본 템플릿으로 사용한다. 즉,Post모델의 기본 템플릿은post_list.html이다.
그래서 템플릿을 생성할 때 이러한 규칙을 지켜줘야하며 다른 이름을 사용하고 싶은 경우에는template_name을 사용하여 템플릿 명을 명시해줘야 한다.
템플릿에서 뷰의 오브젝트들은 따로 선언하지 않아도post_list로 받아진다.
setUp 함수에서 설정한 요소는 포함시킴sr-onlyclass Foreignkey(to, **options)on_delete=models.CASCADEon_delete=models.SET_NULLnull=True를 설정해야 사용 가능on_delete=models.PROTECTon_delete=models.SET(func)func을 수행on_delete=models.SET(func)# N -> 1 : 댓글에서 게시글로 접근
comment.post
# 1 -> N : 게시글에서 댓글로 접근
post.comment_set
class ManyToManyField(to, **options)null=True가 설정되어 있음null=True와 blank=True의 차이null=Truenull 값을 허용. 데이터베이스에 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)

for문 등을 사용할 때 들여쓰기도 자동으로 맞춰줌pip install django_extensions
pip install ipython
# settings.py
INSTALLED_APPS = [
...
'django_extensions',
]

get_context_dataListView나 DetailView 클래스는 기본적으로 get_context_data 메서드를 내장함ListView를 상속받은 클래스에서 model=Post라고 선언하는 것은 post_list=Post.objects.all()과 동일post_list.html에서 {% for p in post_list %}와 같은 명령어를 바로 사용할 수 있는 것임form을 사용할 때 csrf 공격을 방어해주는 기능{% csrf_token %} 으로 사용form을 생성하면 꼭 사용해줘야 함form 안에 무작위의 토큰을 input 값으로 부여하고 나중에 서버에 POST로 들어온 값이 그 토큰 값과 일치하는지 확인 과정을 거침{% csrf_token %}를 사용하지 않으면 403 Forbidden 발생CreateView 클래스에서 제공하는 함수# 사용하려는 템플릿 상단에 {% load crispy_forms_tags %}
{% load crispy_forms_tags %}
# form에 crispy 적용
{{ form | crispy }}

# 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 }} # 이 줄만 추가하면 됨

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