Django 프로젝트-To Do List(5): GenericView - CreateView, UpdateView, DeleteView
1. CreateView 구현
이제 모델을 만들 수 있는 폼을 만들어보자. 이것 또한 기본 순서는 앞선 리스트뷰, 디테일뷰와 같다. 하지만 안의 내용이 살짝 다르니 한번 살펴보도록 하자.
우선 CreateView는 모델을 직접 생성하는 뷰이기 때문에 form이 필요하다. 이러한 form을 만드는 과정이 있어야 하는데 우선 뷰부터 만들어보자. 비슷한 구조이지만 처음 보는 항목이 있다. fields와 success_url인데 하나 씩 알아보자.
fields는 form을 만들었을 때 보이는 항목이다. 리스트 형태로 지정해줄 수 있지만 여기서는 “__all__“로 모든 모델이 보이게 했다.
success_url은 form을 성공적으로 전송했을 때 다시 돌아갈 url을 지정하는 항목이다. 여기서 reverse_lazy라는 함수가 필요한데 이는 지정한 url로 이동하게끔 하는 함수이다. 함수형 뷰에서는 reverse 클래스형 뷰에서는 reverse_lazy를 사용한다. 둘의 차이에 대해 잘 요약한 글이 있어 아래에 첨부한다.
# task/views.py
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
class TaskCreate(CreateView):
model = Task
fields = '__all__'
success_url = reverse_lazy('tasks')
뷰를 만들고 url을 연결한다.
# task/urls.py
from .views import TaskList, TaskDetail, TaskCreate
urlpatterns = [
path('create-task', TaskCreate.as_view(), name="task-create"),
]
템플릿 작업을 진행해야 하는데 CreateView 또한 앱이름_form으로 디폴트 템플릿 이름이 있다. 이제 본격적으로 템플릿을 만들어보자. 먼저 폼을 만들어야 하는데 폼 태그에서 알아야 할 것들이 몇 가지 있다. 하나 씩 살펴보자.
먼저 폼 태그에 대해 살펴보자. 폼태그의 속성에 method가 있는데 이는 POST 방식인지 GET 방식인지 명시해주는 속성으로 여기서는 데이터를 서버로 보내는 것이므로 POST를 사용한다.
폼 태그 안의 내용들을 보면 우선 csrf_token이 존재한다. 이는 데이터를 보낼 때 보안을 위해 토큰 값을 보내주는 함수로 폼 태그를 사용할 때 꼭 같이 써주어야 한다.
다음은 form 변수인데 이는 모델들의 폼을 출력해주는 변수이다. 앞서 살펴보았던 뷰의 fields로 어떤 폼을 출력해줄 것인지 정할 수 있다. 뒤에 붙은 as_p는 폼을 단락형태로 배열하여 조금 더 보기 좋게 만들어준다. 마지막에는 input 태그를 통해 작성한 폼을 서버로 전송하는 버튼을 만들어 준다.
<!--task/templates/task/task_form.html-->
<h3>Task Form</h3>
<a href="{% url 'tasks' %}">Go back</a>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit">
</form>
2. UpdateView 구현
모델을 생성하는 뷰를 만들었다면 이제 생성된 모델을 수정하는 뷰를 작성해보자. UpdataView는 CreateView와 거의 동일하게 구현해주면 되는데 한 가지 다른 점은 url을 연결할 때 각각의 모델 하나씩을 보는 것이기 때문에 pk번호를 붙여주어야 한다는 것이다.
# task/views.py
from django.views.generic.edit import CreateView, UpdateView
from django.urls import reverse_lazy
class TaskUpdate(UpdateView):
model = Task
fields = '__all__'
success_url = reverse_lazy('tasks')
# task/urls.py
from .views import TaskList, TaskDetail, TaskCreate, TaskUpdate
urlpatterns = [
path('create-update/<int:pk>', TaskCreate.as_view(), name="task-update"),
]
작성된 폼을 수정만 하는 것이기에 템플릿은 task_form을 공유한다.
3. DeleteView 구현
마지막으로 모델을 삭제할 수 있게 해주는 DeleteView를 작성해보려 한다. 여기서도 별 다를 것은 없고 기본 템플릿 이름은 앱이름_confirm_delete이니 알아두면 될 것 같다.
# task/views.py
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
class TaskDelete(DeleteView):
model = Task
context_object_name = 'task'
success_url = reverse_lazy('tasks')
# task/urls.py
from .views import TaskList, TaskDetail, TaskCreate, TaskUpdate, TaskDelete
urlpatterns = [
path('task-delete/<int:pk>', TaskDelete.as_view(), name="task-delete"),
]
<!--task/templates/task/task_confirm.html-->
<a href="{% url 'tasks' %}">Go back</a>
<form method="POST">
{% csrf_token %}
<p>Are you sure you want to delete this task "{{ task }}"</p>
<input type="submit" value="Delete">
</form>
4. 리스트뷰 템플릿 수정
이제 뷰들을 모두 구현했으니 해당 뷰로 이동할 수 있게해주는 링크를 리스트 템플릿에 작성해야 한다.
<!--task/templates/task/task_list.html-->
<h1>My to do list</h1>
<a href="{% url 'task-create' %}">Add Task</a>
<table>
<tr>
<th>Items</th>
<th></th>
<th></th>
</tr>
{% for task in tasks %}
<tr>
<td>{{ task.title }}</td>
<td><a href="{% url 'task' task.id %}">View</a> </td>
<td><a href="{% url 'task-update' task.id %}">Edit</a> </td>
<td><a href="{% url 'task-delete' task.id %}">Delete</a> </td>
</tr>
{% empty %}
<h1>No items in list</h1>
{% endfor %}
</table>
핵심요약
- reverse_lazy(“템플릿”)
- fields: 폼 태그 변수에 나타낼 값
- createview 디폴트 템플릿 이름: 앱이름_form.html
- csrf_token: 폼 태그와 항상 짝꿍
- delelteview: 앱이름_confirm_delete.html
Leave a comment