데이터베이스에 적용시켜야 하는 변화에 대한 기록.
웹에 어떤 것을 추가했다면 데이터베이스에도 적용해야함.
이를 '마이그레이션 해야한다' 라고 표현.
데이터베이스와 관련된 사항에 변경이 되었다면 항상 마이그레이션을 수행해야 적용됨.
makemigerations
은 업데이터 해야할 사항들이 기록된 파일 생성.migrate
기록된 파일에 적혀있는 사항들을 실제로 적용.장고는 새 프로젝트를 생성할 때 데이터베이스에 기본적으로 필요한 테이블을 미리 마련해두기 때문에 새 프로젝트를 생성한 뒤
runserver
명령어를 사용하면 마이그레이션이 필요하다는 경고문이 뜬다.
장고에서 사용하는 디자인 패턴.
{% load static %}
를 추가해 정적 파일을 사용하겠다고 선언 해야한다.뷰 페이지를 만들 때 사용하는 방식.
CBV로 뷰 페이지를 구성할 때 사용하는 클래스는 아래와 같다.
이 클래스를 뷰에 상속 받아 사용하면 된다.
모델명 뒤에
_list
가 붙은 html 파일을 기본 템플릿으로 사용한다. 즉,Post
모델의 기본 템플릿은post_list.html
이다.
그래서 템플릿을 생성할 때 이러한 규칙을 지켜줘야하며 다른 이름을 사용하고 싶은 경우에는template_name
을 사용하여 템플릿 명을 명시해줘야 한다.
템플릿에서 뷰의 오브젝트들은 따로 선언하지 않아도post_list
로 받아진다.
setUp
함수에서 설정한 요소는 포함시킴sr-only
class Foreignkey(to, **options)
on_delete=models.CASCADE
on_delete=models.SET_NULL
null=True
를 설정해야 사용 가능on_delete=models.PROTECT
on_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=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)
for
문 등을 사용할 때 들여쓰기도 자동으로 맞춰줌pip install django_extensions
pip install ipython
# settings.py
INSTALLED_APPS = [
...
'django_extensions',
]
get_context_data
ListView
나 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
.