Django(16)

9mond·2023년 11월 14일
0
post-thumbnail

1. many to many relation

  • 다대다 관계
  • django에서 권장사항은 아니지만 간단한 예제에 쓰이기도 한다.
  • A모델의 여러 레코드가 B모델의 여러 레코드에 연결될 수 있는 관계
  • Post, Tag(인스타) -> 하나의 게시글에 여러 태그가 달린다.
    -> 또한 하나의 태그는 여러 게시글에도 달린다.
  • Tag 만들기
  • migrations, migrate 진행



  • manytomany 관계 걸기
  • 다대다 관계의 클래스에서의 컬럼 작성 위치는 중요하지 않으나, 비즈니스 로직적으로 판단했을 때 중요한 클래스에 놓는게 맞다.
  • migrations, migrate 진행
  • tag가 생겼다.
  • ctrl 눌러서 여러 tag 선택 후 저장
  • list에 태그 보이게 하기

  • tag를 누르면 해당 tag가 된 게시글들 보이게 하기
  • a태그 추가

  • Tag import 추가


2. 역참조

  • Post에서

    	tags = models.ManyToManyField(Tag, blank=True)
    	manytomany 관계 작성을 기준으로 설명
  • post 객체는 tags를 통해 연결된 태그들을 가져올 수 있다.

	post = Post.objects.get(id=1)
	# 해당 게시물에 연결된 모든 태그들을 가져올 수 있다.
	tags = post.tags.all()
  • 반대로 tag 객체는 post_set을 통해서 연결된 게시물을 가져올 수 있다.
	tag = Tag.objects.get(id=1)
	# 해당 태그와 연결된 모든 게시물들을 가져올 수 있다.
	posts = tag.post_set.all()
  • 역참조 매니저를 통해 다대다 관계를 역방향으로 조회할 수 있으며, 필요에 따라 역참조 매니저의 이름을 직접 설정할 수 있다.
  • tag로 검색했을 때

3. CreateView

  • 새로운 화면을 만드는데 필요하다.
  • fields는 Post 모델에서 가져올 필수 리스트
  • 일반적으로 CreateView에서 사용되는 템플릿 이름은 "모델명_form.html"이다.
  • Post 모델의 객체를 생성하는 CreateView를 구현하고 있기 때문에 post_form.html을 요청하고 있는 것이다.
  • 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이 명시되지 않은 경우에는 에러가 발생한다.

4. {{ form }}

  • 장고 템플릿에서 {{ form }}은 전체 폼을 렌더링하기 위해 사용되는 템플릿 변수이다.

  • 이 변수는 폼에 대한 HTML 마크업을 나타내며, 폼의 필드, 레이블, 입력 요소, 관계된 에러나 유효성 검사(Validation) 메세지 등이 포함된다.

  • 버튼 생성

  • validation check가 되고

  • 이런 에러가 난다.

  • post 방식으로 submit 해줄 때 악성코드가 있을 수도 있기 때문에 장고에서 {% csrf_token %}이라는 토큰으로 방지한다.

  • 장고가 제공하는 자동 보안

5. {% csrf_token %}

  • 보안을 위해 장고에서 제공해주는 기능이다.

  • 봇에 의해 광고로 게시판이 덮어지지 않도록 한다.

  • {% csrf_token %} 값을 넣어주면 된다.

  • 그럼 이렇게 자동으로 후처리가 된다.

  • createview 옆에 검색창 등을 없애줄거다.

  • base.html을 복사해서 base_full_width.html 생성

  • 저 범위 만큼 코드 제거


  • post_form.html에 코드 수정

  • 옆에 창들이 사라졌다.

profile
개발자

0개의 댓글