クラスベースビューであるCreateView(編集するためのビュー)を利用して、新規作成画面を作成してみます。
CreateViewはオブジェクトの新規作成フォーム画面の描画およびバリデーションエラー表示の機能を持つクラスです。オブジェクトとはモデルのデータであり、本記事では下記のMemberモデルを利用します。アプリケーション名はuserで作成しています。
user/models.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from django.db import models from django.core.validators import MinLengthValidator, RegexValidator from django.core.exceptions import ValidationError def check_age(value): if value < 10 or value > 100: raise ValidationError('10〜100歳が範囲ですよ!') class Member(models.Model): name = models.CharField(max_length=100) nickname = models.CharField(max_length=100, validators=[MinLengthValidator(5, '5文字以上です!'), RegexValidator(r'^[a-zA-Z0-9]*$', '英数字のみです!')]) age = models.IntegerField( default=0, validators=[check_age]) def __str__(self): return self.name |
なお上述したモデルのバリデーションは、下記の関連ページで説明している設定です。また「ListView」および「DetailView」による詳細画面作成の説明はしていませんので合わせてご覧下さい。
関連ページ
以下コードと説明です。
user/views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
from django.shortcuts import render from .models import Member from django.views.generic import ListView, DetailView, CreateView from django.urls import reverse class MemberList(ListView): model = Member class MemberDetail(DetailView): model = Member class MemberCreate(CreateView): # template_name = 'user/member_form.html' model = Member fields = ['name', 'nickname', 'age'] def get_success_url(self): return reverse('detail', kwargs={'pk': self.object.pk}) |
16行目
template_nameに利用するテンプレートを指定しています。デフォルトでは「アプリ名/モデル名_form.html」が設定されているので、下記で記述している階層において「member_form.html」テンプレートを作成していれば、特に記述する必要はありません。
18行目
テンプレート側で表示させるフィールドを指定しています。
20/21行目
登録が成功した際の画面遷移先を指定しています。「detail」はurls.pyのpathの第3引数のnameで指定した名前で、上記ではDetailViewによる詳細画面へと遷移させています(例:http://127.0.0.1:8000/user/5/)。CreateViewでは「self.object」によってオブジェクト(Memberオブジェクト)にアクセスすることができます。
成功した際の遷移先として単純にURLを指定する場合は、get_success_url()を使わずに下記のように記述することができます。
1 |
success_url = "/user/" |
またget_form()によって、ラベル(label)等の表示や入力必須等の設定を変更することもできます。
1 2 3 4 5 6 |
def get_form(self): form = super(MemberCreate, self).get_form() form.fields['name'].label = '名前' form.initial['name'] = '名前ですよ' form.fields['nickname'].required = False return form |
user/urls.py
1 2 3 4 5 6 7 8 |
from django.urls import path from . import views urlpatterns = [ path('', views.MemberList.as_view(), name='member'), path('<int:pk>/', views.MemberDetail.as_view(), name='detail'), path('create/', views.MemberCreate.as_view(), name='create'), ] |
user/templates/user/member_form.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>CreateViewサンプル</title> </head> <body> <h1>CreateView新規作成画面</h1> <form method="post" novalidate> {% csrf_token %} {{ form.as_p }} <input type="submit" value="保存"> </form> </body> </html> |
関連ページ
参照ページ
django ドキュメント
Generic editing ビュー CreateView