モデル
ListViewで使用した以下のmodelを使います。
View
UpdatebookViewクラスを作成しました。
# test_app/views.py from django.views.generic import ListView from django.views.generic.edit import CreateView, UpdateView # Book を使うためにインポート from .models import Book from .forms import BookForm from django.urls import reverse, reverse_lazy class BookListView(ListView): model = Book template_name = "test_app/book_list.html" context_object_name = "books" class AddNewBookView(CreateView): model = Book template_name = "test_app/add_new_book.html" form_class = BookForm def get_success_url(self): # Book一覧に遷移する return reverse_lazy('book_list') class UpdatebookView(UpdateView): model = Book template_name = "test_app/update_book.html" form_class = BookForm def get_success_url(self): # Book一覧に遷移する return reverse_lazy('book_list')
Form
CreateViewで使用したForm(BookForm)を使用しています。
URL
UpdateView では、更新対象のデータを特定するために URL で主キー(pk)を指定する必要があります。
は整数の主キーを pk という名前でビューに渡します。UpdateView はこの pk を使って、編集対象のオブジェクトを自動的に取得します。
from django.urls import path from .views import * urlpatterns = [ # /にアクセスした時、BookListViewを呼び出す path("", BookListView.as_view(), name="book_list"), path("add_new_book", AddNewBookView.as_view(), name="add_book"), path("update_book/<int:pk>", UpdatebookView.as_view(), name="update_book"), ]
テンプレート
test_app/update_book.html です。今回は以下のように記述しました。
<h1>{{ book.title }}を編集</h1> <form method="post"> {% csrf_token %} <div>本のタイトル <br>{{ form.title }}</div><br> <div>本の説明 <br>{{ form.description }}</div><br> <div>著者 <br>{{ form.author }}</div><br> <div>記事の作成者 <br>{{ form.creator }}</div><br> <button type="submit">変更する</button> </form>
例えば「http://127.0.0.1:8000/update_book/1」にアクセスするとpk:1の本を編集することができます。

またtest_app/book_list.html に「<a href=”{% url ‘update_book’ book.id %}”>編集</a>」を加え、編集画面へのリンクを作成しました。
<!-- test_app/templates/test_app/top_page.html --> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>トップページ</title> </head> <body> <h1>ようこそ、トップページへ!</h1> {% for book in books %} <li>タイトル:{{ book.title }}</li> <li>本の説明:{{ book.description }}</li> <li>著者:{{ book.author }}</li> <li>記事の作成者:{{ book.creator }} <a href="{% url 'update_book' book.id %}">編集</a></li> <br> {% endfor %} </body> </html>
コメント