クラスベースビューでの削除機能の作成について
前回はクラスベースビューを使ってブログ記事の更新画面を作成した。
今回はクラスベースビューを使って削除機能を作成する。
前回:【Django】クラスベースビューで更新画面を作成【ブログアプリ2】
現在のディレクトリ構成は以下の通り。
■ディレクトリ構成
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 |
デスクトップ └Blog2 ├app │ ├migrations │ ├__init__.py │ ├admin.py │ ├apps.py │ ├models.py │ ├tests.py │ ├views.py │ ├urls.py │ └forms.py ├db.sqlite3 ├config │ ├・・・ │ ├settings.py │ └urls.py ├templates │ ├base.html │ ├index.html │ ├list.html │ ├create.html │ ├detail.html │ └update.html ├env_blog2 └manage.py |
クラスベースビューで削除機能を作成する手順
urls.pyの編集
~デスクトップ/Blog2/app/urls.py
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from django.urls import path, include from .views import TopPageView1, TopPageView2, BlogListView, BlogCreateView, BlogDetailView, BlogUpdateView, BlogDeleteView #[1] app_name = 'blog' urlpatterns = [ path('', TopPageView1.as_view(), name="index1"), path('index/', TopPageView2.as_view(), name="index2"), path('list/', BlogListView.as_view(), name="list"), path('create/', BlogCreateView.as_view(), name="create"), path('detail/<int:pk>/', BlogDetailView.as_view(), name="detail"), path('update/<int:pk>/', BlogUpdateView.as_view(), name="update"), path('delete/<int:pk>/', BlogDeleteView.as_view(), name="delete"), #[2] ] |
[1]BlogDeleteViewのインポート。
BlogDeleteViewは未作成なので、次の手順で作成する。
[2]新しいURLパターンの追加
利用者からのリクエストURLが以下と一致した場合に実行されるPath関数を追加した。
例
http://127.0.0.1:8000/app/delete/1
views.pyの編集
~デスクトップ/Blog2/app/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 45 46 47 48 49 50 |
from django.shortcuts import render from django.views.generic import View, TemplateView, ListView, CreateView, DetailView, UpdateView, DeleteView #[1] from django.urls import reverse_lazy from .models import Blog from .forms import CreateForm, UpdateForm # Create your views here. class TopPageView1(View): def get(self, request): template_name = 'index.html' return render(request, template_name) class TopPageView2(TemplateView): template_name = 'index.html' class BlogListView(ListView): model = Blog template_name = 'list.html' context_object_name = 'blogs' class BlogCreateView(CreateView): model = Blog form_class = CreateForm template_name = 'create.html' success_url = reverse_lazy('blog:list') class BlogDetailView(DetailView): model = Blog template_name = 'detail.html' context_object_name = 'blog' class BlogUpdateView(UpdateView): model = Blog form_class = UpdateForm template_name = 'update.html' #success_url = reverse_lazy('blog:list') def get_success_url(self): return reverse_lazy('blog:detail', kwargs={'pk': self.object.pk}) #[2] class BlogDeleteView(DeleteView): model = Blog template_name = 'delete.html' success_url = reverse_lazy('blog:list') |
[1]DeleteViewのインポート
DeleteViewはDjangoのクラスベースの汎用ビュー。
削除に特化している。
[2]BlogDeleteViewクラスの作成
BlogDeleteViewクラスは汎用ビューのDeleteViewクラスを継承している。
変数modelにBlogモデルを格納。
変数template_nameにdelete.htmlのアドレスを格納。
success_urlにはreverse_lazy関数の戻りを格納して、一覧画面へのリダイレクトを行うようにした。
delete.htmlの作成
~デスクトップ/Blog2/template/delete.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{% extends 'base.html' %} {% block title %}ブログ{% endblock %} {% block content%} <h1>削除しますか?</h1> <form method="post"> {% csrf_token %} <p>タイトル: {{ object.title }}</p> <p>内容: {{ object.content }}</p> <button type="submit">削除</button> </form> <a href="{% url 'blog:list' %}">一覧画面に戻る</a> {% endblock %} |
Pタグでタイトルと内容を表示しつつ、
削除ボタンを作成。
また、一覧画面へのリンクを作成している。
ディレクトリ構成の確認
現在のディレクトリ構成は以下の通り。
■ディレクトリ構成
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 |
デスクトップ └Blog2 ├app │ ├migrations │ ├__init__.py │ ├admin.py │ ├apps.py │ ├models.py │ ├tests.py │ ├views.py #編集 │ ├urls.py #編集 │ └forms.py ├db.sqlite3 ├config │ ├・・・ │ ├settings.py │ └urls.py ├templates │ ├base.html │ ├index.html │ ├list.html │ ├create.html │ ├detail.html │ ├update.html │ └delete.html #新規作成 ├env_blog2 └manage.py |
Django記事一覧
前回:【Django】クラスベースビューで更新画面を作成【ブログアプリ2】
次回:
コメント