0부터 시작하는 Django 공부 - 게시글 작성자

Jaehong Lee·2022년 6월 20일
0
post-thumbnail

1. 작성자와 게시글의 관계

  • 작성자와 게시글의 관계를 구현해야한다
  • 작성자와 게시글은 1:N(1대다) 관계
  • 보통 N쪽에 관계를 맺는 설정을 추가시킨다. 즉, 게시물 Model에 설정을 추가해야한다

2. N에 해당하는 model (board) 에 참조 코드 구현

  • ForeignKey를 통해 참조. writer는 Django의 User model에 포함된 값만 저장될 수 있게 제약을 설정
  • user은 Django에서 제공해주는 model,즉 writer는 user을 참조한다. 이 user는 무결성 참조조건에 의해 존재하는 값 혹은 null 값 만 써야한다
  • 이 user는 django.contrib.auth.models에서 import한 객체로 사용자의 정보
  • 참조하는 user가 삭제될 때 게시글을 남기거나 삭제하는 옵션 = on_delete, CASCADE = 삭제

3. migration

  • migartion error
  • 이미 존재하는 model에 새 속성 추가시 해당 속성에 대한 값을 어떻게 할 것인가?
    1. 자동으로 지정한 값이나 null값을 자동으로 넣어준다
    2. migrate를 종료하고, 사용자가 수동으로 넣어준다
  • 1번 옵션을 사용하여 사용자의 id의 값을 넣어주게 한다
  • 위와 같이 열쇠모양 (기본키)에 해당하는 값을 넣어줘야 하며, 현재 존재하는 값, 즉 이번 실습에서는 존재하는 user의 id값을 넣어줘야한다
  • 새 migration file이 생성
  • migrate 적용시 DB에 추가된다
  • showmigrations : 지금까지 적용된 migration을 확인할 수 있다. 이때 x표시된 사항은 migration이 완료된 사항이다
  • 실행 결과

4. login이 안된 사용자가 게시글을 수정, 삭제하지 못하게 하기

  • 4.1 decorator

    • 함수 위에 @~ 표시로 작성하여 기능을 추가할 수 있다
    • login_requried() 기능은 login할 시 밑에 함수가 실행된다
    • login 상태가 아니라면, 지정한 url로 가게 설정

5. 게시물 작성자 구분

  • 게시물 작성자와 login user를 비교한다

  • login한 user의 정보는 request.user에 담겨있다

  • 5.1 작성자만 삭제 가능하게 views 수정

    • 작성자와 user를 비교하여 작성자만 삭제 가능하게 한다
    • 현재 작성자 id는 1이므로 다른 id의 user는 삭제가 불가능하다
  • 5.2 게시글 작성자 입력

    1. front에서 처리하는 방법 : form에 writer를 추가
    • 실행 결과
    • update도 같은 template form을 사용하므로 동일하다
    • login한 user를 작성자로 설정하게 수정한다
      1. form 수정
      • exclude를 통해 form에서 writer를 제외시킨다. 즉, 입력받지 않는다. exclude로 입력받지 않은 값을 지정하지 않으면 is_valid에서 null값에 대한 error가 발생할 수 있다
      1. views 수정
      • 작성자를 user로 설정한다. 이 설정을 안하면 writer를 form에서 exclude했기에 유효성 검사는 통과하지만 null값이 들어간다
  • 5.3 게시글 작성자만 수정이 가능하게 view 수정

6. 게시글에 수정&삭제 버튼 추가

  • front에서 처리하는 부분
  • 작성자만 보이게 설정해야한다
  • 6.1 template 수정


    post가 존재하면 내용 출력, user가 작성자라면 버튼 출력

    • 결과
    1. 작성자라면
    2. 작성자가 아니라면
    • error 해결 : objects.filter를 사용하면 list로 반환되므로, for문을 통해 추출해야한다. 따라서 하나의 Data를 출력하려면 get 사용

7. DB & Django

  • DB에서 임의로 DATA를 조작하면 migration 정보가 남지않아 Django에서 인식 못하는 동기화 문제가 있기때문에 Django에서 단계대로 조작해야한다
  • Django migrations table에 Django와 DB의 연결에 대한 정보가 저장되어있다

    • migrate를 취소나 되돌리고 싶을때는 원하는 App 이름 + 번호로 되돌릴 수 있다
    • zero를 사용하면 table 자체가 삭제된다
profile
멋진 엔지니어가 될 때까지

0개의 댓글

관련 채용 정보