[申請承認アプリ]フォームの作成

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へアクセスしてみてください。フォームが表示され、入力・送信したらインデックスページへ飛ぶことを確認してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です