Django
でデータの登録や更新、検索条件などに使用するForm
に初期値を設定する方法を説明していきます。
設定方法は3パターンあります。
- views.pyで設定する方法
- Formの各フィールドに設定する方法
- Formの
__init__()
で設定する方法
設定方法を順に説明していきたいと思います。
目次
forms.py
下記のようなforms.py
をあらかじめ実装しておきます。
# forms.py
class SampleForm(forms.Form):
d = forms.DateField(label='日付')
txt = forms.CharField(label='テキスト')
bool = forms.BooleanField(label='フラグ')
num = forms.IntegerField(label='数字')
email = forms.EmailField(label='メール', min_length=10)
views.pyで設定する方法
views.py
のView
クラスの中でForm
クラスをインスタンス化する際に初期化を行います。
# views.py
class SampleView(generic.View):
def get(self, request):
initial_dict = dict(d=date(2020, 4, 29), txt='Text', bool=True, num=10, email='test@sample.com')
form = SampleForm(request.GET or None, initial=initial_dict)
return render(request, 'form.html', dict(form=form))
とりあえずhtml
側でform.as_p
を実行してフォームの部品を表示します。
{{ form.as_p }}
すると、
このようにフォームの各部品に初期値が設定されます。
Formの各フィールドに設定する方法
Form
クラスの各フィールドに設定する場合は、各フィールドにinitial
を設定します。
# forms.py
class SampleForm(forms.Form):
d = forms.DateField(label='日付', initial=date(2020, 4, 29))
txt = forms.CharField(label='テキスト', initial='Text')
bool = forms.BooleanField(label='フラグ', initial=True)
num = forms.IntegerField(label='数字', initial=20)
email = forms.EmailField(label='メール', min_length=10, initial='sample@test.com')
画面はこんな感じになります。
Formの__init__()
で設定する方法
Form
クラスの__init__()
で設定する場合は下記のように実装します。
# forms.py
class SampleForm(forms.Form):
def __init__(self, *args, **kwargs):
super(SampleForm, self).__init__(*args, **kwargs)
self.fields['d'].initial = date(2020, 4, 29)
self.fields['txt'].initial = 'Text'
d = forms.DateField(label='日付')
txt = forms.CharField(label='テキスト')
bool = forms.BooleanField(label='フラグ')
num = forms.IntegerField(label='数字')
email = forms.EmailField(label='メール', min_length=10)
画面はこのようになります。
それぞれの設定方法の使いどころについて
Form
の初期値の設定方法は3パターンありますが、それぞれどういった時に使えば良いか参考までにまとめておきます。
views.pyで設定する方法
初期値がviews.py
の処理によって変わる場合、views.py
の処理と連動して初期値を変更できるのでviews.py
で初期値を設定するとよいと思います。ログインユーザの情報をForm
の初期値に設定したい場合などですね。
Formの各フィールドに設定する方法
初期値が必ず固定値となるのであればForm
の各フィールドに直接設定するのがよいと思います。例えば何かを販売する画面などで販売数量にあらかじめ「1」をセットしておきたい場合などですかね。
Formの__init__()
で設定する方法
DBなどから値は取得するがviews.py
のロジックと関連がない場合などはForm
クラスの__init__()
で初期値を設定した方がよいですね。セレクトボックスの初期値として、特定のレコードを選択したい場合などに、__init__()
内で処理を実装しておけばviews.py
にロジックと関係のない処理を記述する必要がなくなります。
最後に
Form
に初期値を設定する方法はいろいろありますが、それぞれの設定方法の特徴を活かした実装を心がけたいですね。
コメント