CreateView

モデル

ListViewで使用した以下のmodelを使います。

View

AddNewBookViewを作成しました。今回のポイントは以下:

「from django.views.generic.edit import CreateView」でCreateViewをインポート

「from .forms import AddNewBookForm」でmodelに対応したformをインポート

「get_success_url」で処理が成功したら、book_list画面に遷移する

# 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')

Form

test_app/forms.pyを作成し、以下のように記述します。

from django import forms

# Book を使うためにインポート
from .models import Book 

class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ["title", "description", "author", "creator"]
        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control'}),
        }

class Meta:
model = Book

このフォームは Book モデルに基づいて作る、という指定。


fields = [“title”, “description”, “author”, “creator”]

フォームで表示・編集させたいモデルのフィールドをリストで指定してる。


widgets = {
‘title’: forms.TextInput(attrs={‘class’: ‘form-control’}),
}

title フィールドに Bootstrap 用の form-control クラスを追加して、見た目を整えてる。

URL

AddNewBookView をパスに含めました。

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")
]

テンプレート

Viewから渡されるFormはデフォルトではformとなっています。

各入力フィールドに対応しており、form.titleとするとタイトルのフィールドになります。

<h1>新しい本を追加</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/add_new_book」にアクセスすると以下のように表示されると思います。

コメント

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