クラスベースビューであるDeleteView(編集するためのビュー)を利用して、レコードの削除機能を実装してみます。
本記事は、下記関連ページの続きです。
関連ページ
DeleteViewはオブジェクト(モデルによるデータ)の削除に特化した機能を持つクラスです。GETメソッドによってアクセスした場合に確認画面が表示され、POSTメソッドによって目的のオブジェクトを削除することができます。
下記イラストで説明すれば、「〜user/3/delete/」アクセス時に確認画面が表示され、「削除する」ボタンをクリックするとデータが削除されます。
以下コードと説明です。
user/views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
from django.shortcuts import render from .models import Member from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView from django.urls import reverse, reverse_lazy class MemberList(ListView): model = Member class MemberDetail(DetailView): model = Member class MemberCreate(CreateView): # template_name = 'user/member_form.html' model = Member fields = ['name', 'nickname', 'age'] def get_success_url(self): return reverse('detail', kwargs={'pk': self.object.pk}) class MemberUpdate(UpdateView): template_name = 'user/member_update_form.html' model = Member fields = ['name', 'nickname', 'age'] def get_success_url(self): return reverse('detail', kwargs={'pk': self.object.pk}) def get_form(self): form = super(MemberUpdate, self).get_form() form.fields['name'].label = '名前' form.fields['nickname'].label = 'ニックネーム' form.fields['age'].label = '年齢' return form class MemberDelete(DeleteView): # template_name = 'user/member_confirm_delete.html' model = Member success_url = reverse_lazy('member') |
確認画面としてのテンプレートは、デフォルトでは「アプリ名/モデル名_confirm_delete.html」が設定されています。削除完了すると一覧画面へと遷移させています(44行目)。
user/urls.py
1 2 3 4 5 6 7 8 9 10 |
from django.urls import path from . import views urlpatterns = [ path('', views.MemberList.as_view(), name='member'), path('<int:pk>/', views.MemberDetail.as_view(), name='detail'), path('create/', views.MemberCreate.as_view(), name='create'), path('<int:pk>/update/', views.MemberUpdate.as_view(), name='update'), path('<int:pk>/delete/', views.MemberDelete.as_view(), name='delete'), ] |
user/templates/user/member_confirm_delete.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>DeleteViewサンプル</title> </head> <body> <h1>DeleteView削除確認画面</h1> <form method="post"> {% csrf_token %} <p>{{ member.name }}/{{ member.nickname }}/{{ member.age }}を削除しますか?</p> <input type="submit" value="削除する"> </form> </body> </html> |
削除時の確認画面としてのテンプレートです。
user/templates/user/member_list.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>ListViewサンプル</title> </head> <body> <h1>ListView一覧画面</h1> <table border="1"> <tr> <th>name</th> <th>詳細</th> <th>編集</th> <th>削除</th> </tr> {% for member in object_list %} <tr> <td>{{ member.name }}</td> <th><a href="{% url 'detail' member.pk %}">詳細</a></th> <th><a href="{% url 'update' member.pk %}">編集</a></th> <th><a href="{% url 'delete' member.pk %}">削除</a></th> </tr> {% endfor %} </table> </body> </html> |
参照ページ
django ドキュメント
Generic editing ビュー DeleteView