def test_create_post(self):
response = self.client.get('/blog/create_post/')
self.assertEqual(response.status_code, 301)
soup = BeautifulSoup(response.content, 'html.parser')
self.assertEqual('Create Post - Blog', soup.title.text)
main_area = soup.find('div', id='main_area')
self.assertIn('Create New Post', main_area.text)
/blog/tests.py에 test_create_post() 함수를 만든다.
테스트 코드 내용은 대충
Create Post - Blog
로 되어야 하고 Create New Post
라는 문구가 있어야 한다.이런 내용들이다.
일단 당장은 페이지를 만들기 전이라 Fail이 뜬다.
from django.views.generic import ListView, DetailView, CreateView
class PostCreate(LoginRequiredMixin, CreateView):
model = Post
fields = ['title', 'hook_text', 'content', 'head_image', 'file_upload', 'category']
/blog/views.py에 CreateView를 상속받아 클래스를 만든다.
model = Post로 post를 사용한다고 선언, 필드명을 리스트로 작성해서 저장한다.
urlpatterns = [
path('create_post/', views.PostCreate.as_view()),
(생략)
]
/blog/urls.py에 방금 전 view에 만든 PostCreate 클래스를 사용하도록 추가한다.
{% extends 'blog/base_full_width.html' %}
{% block head_title %}Create Post - Blog{% endblock %}
{% block main_area %}
<h1>Create New Post</h1>
<hr>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<table>
{{ form }}
</table>
<button type="submit" class="btn btn-primary float-right">Submit</button>
</form>
{% endblock %}
템플릿 폴더 아래에 post_form.html 파일을 만들었다.
보여지는 부분은 본인 취향에 맞게 꾸미면 ㅇㅋ
나는 테스트 코드에 맞게 타이틀을 Create Post - Blog
로 지정하고 메인 영역에 Create New Post
문구를 넣었다.
코드를 작성하면서 신기했던 점이 두 가지 있다.
{% csrf_token %}
코드를 form 안에 넣는 것만으로 웹 사이트를 CSRF 공격으로부터 보호할 수 있다.이렇게 작성하고 테스트를 진행하면 현재까지 작성한 모든 테스트를 통과한다.