UpdateView

モデル

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>

コメント

タイトルとURLをコピーしました