##ModelFormとは
ModelFormとはdjango.forms.Modelformで呼び出すことができるあらかじめ用意されているインスタンス。このインスタンスを継承したFormクラスを作成することで、Models.pyに定義したテーブルをそのままに参照できる。つまり、ユーザーからのフォーム入力によってデータベースへの登録や更新を行いたいときに用いられる。
##今回のテクニックはどこで使うのか?
例えば「タイトル、現在時刻、作成者」をフィールドに持つデータモデルについて、ユーザからのフォーム入力を実装するとき、わざわざ現在時刻と作成者をユーザにうたせる作業はUXを下げてしまう。そういった、ユーザにわざわざうってもらう必要のない情報や自動的に情報を与えたいときなどにフォームに初期値を与えて、該当するフィールドを非表示(Hidden)にしてしまう方法によって実現できる。
##まずテンプレート上での非表示の設定の仕方
from django import forms
from .models import Event
class EventCreateForm(forms.ModelForm):
class Meta:
model = Event
fields = ('eventtitle','eventdate','location','agenda','author')
widgets={'author':forms.HiddenInput()
}
ModelFormを知らない方へ軽く説明しておくと、基本的にMetaクラス内で様々な条件をうっていきます。model変数にはmodels.pyのEventクラスをインスタンス化させて指定します。fields変数にはリスト型でフォームにいれるフィールドを指定します。
widgets変数はフィールドのhtmlでのinput表示を変更したり、エラーメッセージの指定など様々なオプションを指定できます。
今回まずこのwidgets内にてauthorフィールドをHiddenInputにして非表示にしています。
##views.pyでのフォーム情報の追加
from django.contrib.auth.models import User
from .forms import EventCreateForm
def createeventfunc(request):
if request.method == 'POST':
form =EventCreateForm(request.POST)
if form.is_valid():
form.save()
return redirect('遷移先')
return render(request,'createevent.html',{'form':form})
#Getメソッドの時、下を実行
#default_dataにてauthorフィールドへの値をセット
else:
default_data = {'author':User.objects.get(pk=request.user.pk)}
form = EventCreateForm(default_data)
return render(request,'createevent.html',{'form':form})
formオブジェクトを作る際にデフォルトの値を引数をして与えられます。
上の例ではまずGetメソッドでurlおよびcreateeventfunc()が呼び出された場合、author:ログイン中のユーザのid(pk)をデフォルトのデータとしてformオブジェクトを生成。そしてそのformオブジェクトをレンダーしています。
form内でsubmitが押されたとき(POST送信とします)、上のif文が実行されます。form.save()とするだけでデータベースへの登録が完了します。