djangoではstartappでアプリフォルダを作成しても、フォームに関する記述を行うforms.pyは自動的には生成されません。
これは、簡単なフォームの場合はviewの中で表示フィールドの設定をするだけでも問題ないためです。
ただ、実際にはバリデーションを追加したり、ウィジェットの設定を行ったり、ヘルプテキストを追加したりと、フォームをカスタマイズすることが必要になるケースの方が多いと思います。
ここでは、views.pyと同じフォルダにforms.pyを新たに作成する場合の流れについて説明します。
まずは、新たなファイルを作成して、下記の内容を入力し、forms.pyとして保存しましょう。
from django import forms
from .models import Seminar
class SeminarForm(forms.ModelForm):
class Meta:
model = Seminar
fields = (
"name",
"type",
"accept_start_date",
"accept_end_date",
"start_date",
"end_date",
"overview")
ここではModelFormクラスを継承してSeminarFormを作成しています。ここではmetaクラスでmodelと表示するfieldsを指定する必要があります。fieldsで指定する項目名はmodels.pyの中で定義したSeminarクラス内のフィールド名を指定していきます。
今回は全ての項目をフォームで表示したいので、seminarクラスで定義したフィールドを全て書いています。
続いてviewを作成していきましょう。
from django.shortcuts import render
from django.views.generic import TemplateView, CreateView #CreateViewを追加
from .form import SeminarForm #追加
class index(TemplateView):
template_name = "application/index.html"
#以下を追加
class program_add(CreateView):
form_class = SeminarForm
template_name="application/program_add.html"
success_url="/"
ここではCreateViewを継承したprogram_addクラスを作成しています。この中では先程作成したフォームクラスと、テンプレート、完了時の遷移先(success_url)を指定する必要があります。
指定したテンプレートの中身を作っていきましょう。program_add.htmlは下記の通りと作成しました。
{% extends 'base/base.html' %}
{% load crispy_forms_tags %}
{%block content%}
<form action="" method="POST">
{% csrf_token %}
{{ form|crispy }}
<button type="submit" class="btn btn-primary">保存</button>
</form>
{%endblock%}
最後にurlsの設定です。まず、プロジェクトのurls.pyは下記の通りとします。
from django.contrib import admin
from django.urls import path, include
from application.views import index
urlpatterns = [
path('admin/', admin.site.urls),
path('application/', include('application.urls')),
path('', index.as_view()),
]
application/の行が追加されていますね。ここではapplicationアプリのurlsを参照しています。
applicationフォルダ内にurls.pyを作成して、下記の通り保存しましょう。
from django.urls import path
from .views import program_add
app_name='application'
urlpatterns = [
path('program/add/', program_add.as_view(),name='program_add'),
]
app_nameは名前空間の定義です。リンク先や遷移先などの指定の時に、urlではなくここで指定した名前空間や、pathの中で指定しているnameの属性を使用して、指定することができます。
これでrunserverを実行して、http://127.0.0.1:8000/application/program/addへアクセスしてみてください。フォームが表示され、入力・送信したらインデックスページへ飛ぶことを確認してください。