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
に初期値を設定する方法はいろいろありますが、それぞれの設定方法の特徴を活かした実装を心がけたいですね。
コメント
[…] http://43.206.46.12/django-form-initial/ […]
[…] http://43.206.46.12/django-form-initial/ […]