モデル
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」にアクセスすると以下のように表示されると思います。

コメント