- Tag 만들기
- migrations, migrate 진행
- manytomany 관계 걸기
- 다대다 관계의 클래스에서의 컬럼 작성 위치는 중요하지 않으나, 비즈니스 로직적으로 판단했을 때 중요한 클래스에 놓는게 맞다.
- migrations, migrate 진행
- tag가 생겼다.
- ctrl 눌러서 여러 tag 선택 후 저장
- list에 태그 보이게 하기
- tag를 누르면 해당 tag가 된 게시글들 보이게 하기
- a태그 추가
- Tag import 추가
Post에서
tags = models.ManyToManyField(Tag, blank=True)
manytomany 관계 작성을 기준으로 설명
post 객체는 tags를 통해 연결된 태그들을 가져올 수 있다.
post = Post.objects.get(id=1)
# 해당 게시물에 연결된 모든 태그들을 가져올 수 있다.
tags = post.tags.all()
tag = Tag.objects.get(id=1)
# 해당 태그와 연결된 모든 게시물들을 가져올 수 있다.
posts = tag.post_set.all()
- tag로 검색했을 때
- insert 페이지를 만들어보자
- insert 화면에서 입력값을 입력 받아서 저장하는데 관여를 하게 된다.
- 이 url로 호출
- post_form.html 생성
- localhost:8000/blog/create_post/ 검색 시 insert화면이 나오게 된다.
- CreateView를 써서 자동으로 생겼다.
- model = Post
- 데이터를 저장할 모델을 지정한다.
- 필수- fields
- 사용할 폼 클래스를 지정한다.
- 필수- template_name
- 사용할 템플릿 파일의 경로를 지정한다.
- 작성을 안할 시 기본값인 post_form.html로 경로설정이 된다.
- 필수는 아님- success_url
- 그 후에 success_url로 리다이렉션 한다.
- 필수는 아님- form_valid()
- form_valid()를 정의하지 않고, success_url을 명시하지 않으면 CreateView는 내부적으로 기본적인 동작을 수행한다.
-> 폼에 데이터 유효성 검사를 한다.
-> 모델 인스턴스 생성 : 폼 데이터가 유효하다면 해당 데이터를 기반으로 모델 클래스의 인스턴스를 생성한다.
-> 데이터베이스에 저장 : 모델 인스턴스를 기반을 데이터베이스에 저장
-> 리다이렉션 : 저장이 성공하면 CreateView는 기본적으로 해당 모델의 get_absolute_url 메서드를 호출하여 리다이렉션할 url을 가져온다. 만약, 해당 메서드가 정의되어 있지 않은 경우, success_url이 url요청을 보낸다.
-> 에러처리 : 만약, get_absolute_url 메서드도 없고, success_url이 명시되지 않은 경우에는 에러가 발생한다.
장고 템플릿에서 {{ form }}은 전체 폼을 렌더링하기 위해 사용되는 템플릿 변수이다.
이 변수는 폼에 대한 HTML 마크업을 나타내며, 폼의 필드, 레이블, 입력 요소, 관계된 에러나 유효성 검사(Validation) 메세지 등이 포함된다.
버튼 생성
validation check가 되고
이런 에러가 난다.
post 방식으로 submit 해줄 때 악성코드가 있을 수도 있기 때문에 장고에서 {% csrf_token %}이라는 토큰으로 방지한다.
장고가 제공하는 자동 보안
보안을 위해 장고에서 제공해주는 기능이다.
봇에 의해 광고로 게시판이 덮어지지 않도록 한다.
{% csrf_token %} 값을 넣어주면 된다.
그럼 이렇게 자동으로 후처리가 된다.
createview 옆에 검색창 등을 없애줄거다.
base.html을 복사해서 base_full_width.html 생성
저 범위 만큼 코드 제거
post_form.html에 코드 수정
옆에 창들이 사라졌다.