DjangoのFormの作成方法
DjangoでFormを利用する場合、django.forms.Formを継承したクラスを作成し、パラメータを設定する。
- forms.py(フォームの作成)
class MyForm(forms.Form):
name = forms.CharField()
email = forms.EmailField()
text = forms.CharField(widget=forms.Textarea)
次に、viewに定義した関数で、上で作成したformのオブジェクトを作り、renderで、テンプレートに渡す。
- views.py(Viewの記述)
from app.models import Topic,Webpage,AccessRecord
from .forms import MyForm
def form_view(request):
form = MyForm() # MyFormインスタンスの作成
return render(request, 'firstapp/form_page.html', {'form': form}) # renderでformインスタンスを渡す
- urls.py(URLマッピング)
from app import views
urlpatterns = [
path('form_page', views.form_view)
]
次に、テンプレートのhtmlファイル上で{{ form.as_p }}としてフォームを表示する。
- テンプレートにフォームを表示
<h1>Fill out the form!</h1>
<div class="container">
<form method="post">
{{ form.as_p }}
<!-- form.as_pとして整形されたformが表示されます -->
{% csrf_token %}
<!-- CSRF(クロスサイトスクリプティング対策用のパラメータです) -->
<input class="btn btn-primary" type="submit" value="Submit" />
</form>
</div>
Formから送信したPOSTリクエストをViewで処理する
djangoを立ち上げてみると以下のような画面が表示される
Formで送信したデータをビューの中で処理するには、以下のように送信先のviewの関数で「if request.method == 'POST':」のようにして、ifの中で処理を定義します
- POSTリクエストをViewで処理する
from django.shortcuts import render
from . import forms
def form_name_view(request):
form = forms.FormName()
# POST処理の場合はifの中を実行
if request.method == 'POST':
form = forms.FormName(request.POST) # formで送信された値を取得
if form.is_valid(): # フォームのバリデーション
# 値をそれぞれ取り出す
print("VALIDATION SUCCESS")
print("NAME: " + form.cleaned_data['name'])
print("EMAIL: " + form.cleaned_data['email'])
print("TEXT: " + form.cleaned_data['text'])
return render(request, 'basicapp/form_page.html', {'form': form})
- POSTリクエストをViewで処理する(スマートな書き方)
from . import forms
def form_name_view(request):
form = forms.FormName(request.POST or None) # formで送信された値を取得。POSTでない場合はNoneで初期化する
if form.is_valid(): # フォームのバリデーション
# 値をそれぞれ取り出す
print("VALIDATION SUCCESS")
print("NAME: " + form.cleaned_data['name'])
print("EMAIL: " + form.cleaned_data['email'])
print("TEXT: " + form.cleaned_data['text'])
return render(request, 'basicapp/form_page.html', {'form': form})