● 포스트 작성 페이지 구현
포스트 작성 페이지 기본 틀 만들기
더이상 admin 같은 관리자 페이지에서 포스트를 작성하는 것이 아닌 일반적인 웹 페이지와 같이 포스트를 쓸 수 있도록 포스트 작성 페이지를 구현해 본다.
테스트 코드 작성
test_create_post() 함수를 새로 만들어 /blog/create_post/ URL로 접근하면 포스트 작성 페이지가 정상적으로 접속되었다는 뜻의 status_code 200 인지 확인하고 특정 제목과 문구가 main-area에 있는지 확인한다.
테스트 하면 당연하게도 404 오류가 출력되는데 이번에는 실수없이 URL 설정을 잘해서 헤메는 일이 없도록 해야한다.
views.py에 CreateView 추가
from django.views.generic import CreateView를 잊지않고 꼭 적어둔다. 이는 Django에서 제공하는 CreateView를 상속받아 PostCreate라는 이름의 클래스를 만들기 위함이다.
URL에 create_post/ 추가
방문자가 blog/create_post/로 URL을 타고 접속하는 경우 views.py의 PostCreate 클래스를 사용하도록 한다.
템플릿 만들기
그대로 테스트 코드를 돌리면 당연하게도 템플릿이 없다면서 오류를 출력하는데 상세하게 post_form.html이 없다고 알려준다. 기존에 쓰지 않았던 새로운 태그가 있는데 <form> 태그는 사용자가 입력한 값을 서버로 보내기 위한 용도고
값을 보내는 방식인 GET, POST 중에 method="post" 입력으로 POST 방식으로 값을 보낸다.
enctype="multipart/form-data"는 파일도 같이 전송 하겠다는 뜻이다. 본래 action="보내고자 하는 URL" 까지 입력해야 하지만 Django는 이걸 편리하게 자동으로 처리해주기 때문에 action은 쓰지 않아도 된다.
{% csrf-token %} 은 CSRF 공격으로 부터 보호해주는 Django가 제공하는 기능으로 폼 이용시 꼭 <form> 태그안에 {% csrf-token %}을 꼭 넣어줘야 한다. 언젠가 보안에 대해 배우게 된다면 CSRF도 한번 알아볼 필요가 있겠다.
대략적으로 나마 완성되었다. 수정해서 더 보기 좋게 꾸며준다.
템플릿 모양 개선
포스트 작성 페이지 에서는 카테고리와 검색창 기능은 제공하지 않는다. 대신 글 쓰기 쾌적하게 기존에 8:4로 나누어져 왼쪽만 메인영역 이였지만 이제는 12칸 전체를 메인영역으로 지정하기로 위해 base_full_width.html 파일을 만든다.
base_full_width.html을 이용하기 위해 post_form.html 파일을 수정한다.
포스트를 로그인한 방문자만 작성할 수 있게 하기
웹 사이트 마다 다르겠지만 로그인 하지 않아도 글을 쓸 수 있는 사이트가 있는가 하면 로그인을 해야지만 글을 쓸 수 있도록 하는 사이트가 있다. 이번 블로그 프로젝트는 커뮤니티 사이트가 아니기 때문에 로그인한 방문자만 포스트를 작성할 수 있도록 하겠다.
테스트 코드 작성
비로그인시 status code가 200이 나오면 테스트를 통과하지 못 하도록 tests.py의 test_create_post() 함수를 수정한다.
여기서 self.client는 실제 사용자가 아닌 테스트 환경에서의 가상 웹 브라이저로 보면 되고 client는 login() 함수 기능을 제공하기 때문에 따로 기능 구현을 위한 코드를 입력하지 않아도 된다.
views.py의 PostCreate에 LoginRequiredMixin 추가
views.py의 PostCreate 클래스에 매개변수로 LoginRequiredMixin 클래스를 추가하게 되면 로그인 했을때만 페이지가 보이게 된다. 이 또한 Django에서 제공하는 클래스로 간편하게 import로 사용하면 된다.
여기서 이미 PostCreate 클래스에서 CreateView 클래스를 상속 받았는데 여기서 LoginRequiredMixin 클래스를 또 상속받은 것처럼 LoginRequiredMinin 메서드를 사용하고 있다. 이는 Mixin 덕분이며 클래스에서 Mixin을 사용하면 다른 클래스의 메서드를 추가할 수 있게되어 PostCreate에 추가하는 것만으로 기능을 구현할 수 있다.
테스트 코드 수정
포스트 작성 페이지에서 포스트를 작성 후 submit 버튼을 클릭하는 것까지 테스트 코드를 구현해 본다.
자동으로 author 필드 채우기
위의 테스트 코드 중에 author 필드를 채우지 못하여 오류가 발생했다. author 필드를 자동으로 채우기 위해 CreateView에서 제공하는 form_valid() 함수를 활용한다. PostCreate의 폼에 내용을 입력하면 제공된 form_valid() 함수가 실행된다. 말 그대로 유효한 form에 담아 보낸 정보로 포스트를 만들고 고유 경로로 보내는(redirect) 역할을 한다.
form_valid() 함수 활용
PostCreate에서 form_valid() 함수를 재정의하여 django에서 제공하는 CreateView의 form_valid() 함수의 기능을 확장할 수 있다.
직접 사이트에 들어가 확인하면 자동으로 author가 채워진 것을 볼 수 있다.
스태프만 포스트를 작성 할 수 있게 만들기
테스트 코드 작성
관리자 페이지의 Users 메뉴에 사용자들의 등급을 일반,스태프,최고 관리자 권한을 부여할 수 있다. 각 권한에 따라 포스트 작성 페이지에 접근이 가능한지 아닌지를 코드로 작성하면 된다.
테스트 코드만 손봐서 그런지 정상적으로 200코드를 출력한다. views.py를 수정해 이를 해결해 본다.
views.py에 UserPassesTestMixin 추가
페이지에 접근 가능한 사용자를 superuser와 staff로 제한하도록 한다.
새 포스트 작성 버튼 만들기
포스트를 작성하기 위해서는 admin 페이지나 /blog/create_post/를 손으로 쳐서 접속해야만 했다. 버튼을 만들어 손쉽게 접속이 가능하도록 한다.
로그인했을 때 <New Post> 버튼 나타내기
post_list.html을 수정한다. 로그인이 되어있고 superuser 나 staff에게만 버튼이 보이도록 설정한다.
관리자 권한 계정으로 확인하기
아주 잘 접속된다.
스태프 권한 계정으로 확인
staff 계정으로는 admin 페이지에 접속해도 할 수 있는게 없지만 포스트 작성은 가능하다.
'Backend > Django + Bootstrap 개발 일지' 카테고리의 다른 글
22. 태그 선택란 추가 (1) | 2022.08.22 |
---|---|
21. 수정 기능 구현 (0) | 2022.08.17 |
19. 다대다 관계 구현(19 ~ 22) (Tag 모델, 포스트 목록과 상세 페이지에 태그 기능 추가, 태그 페이지 구현 ) (0) | 2022.08.08 |
18. 다대일 관계 구현 (카테고리 기능 2) (0) | 2022.08.07 |
17. 다대일 관계 구현 (카테고리 기능) (0) | 2022.08.05 |