Djangoでフォームの値を設定する方法
Djangoでフォームの値を設定する方法をご紹介します。
ここでは、Datepicker(カレンダー入力)の初期値設定方法を例として挙げます。
条件
- Django 2.1.3
- Python 3.7.0
前提
Datepickerのフォームが存在するものとします。
Datepickerの導入方法は以下の記事をご参照ください。
DjangoでDatepicker(カレンダーによる日時入力)を使用する方法
初期値の設定
Djangoのformに初期値を設定する方法は幾つか存在します。
forms.py
formのクラスに直接初期値を設定するのが1つの方法です。
以下ではinitialに空を設定していますが、具体的な値を設定することで初期値を設定することが出来ます。
# forms.py
class CalendarForm(forms.Form):
start_date = forms.DateField(
initial='', # 初期値
label='開始日時',
widget=datetimepicker.DateTimePickerInput(
format='%Y/%m/%d %H:%M:%S',
options={
'locale': 'ja',
'dayViewHeaderFormat': 'YYYY年 MMMM',
'ignoreReadonly': True,
'allowInputToggle': True,
#'minDate': '2018/10/10', # 最小日時
#'defaultDate': '2018/10/10', # 初期表示
}
).start_of('term'),
)
end_date = forms.DateField(
label='終了日時',
initial='', # 初期値
widget=datetimepicker.DateTimePickerInput(
format='%Y/%m/%d %H:%M:%S',
options={
'locale': 'ja',
'dayViewHeaderFormat': 'YYYY年 MMMM',
'ignoreReadonly': True,
'allowInputToggle': True,
'maxDate': (dt.now() + timedelta(days = 1)).strftime('%Y/%m/%d %H:%M:%S'), # 最大日時(翌日)
}
).end_of('term'),
)
views.py
viewでformの初期値を設定することもできます。
以下では2つの方法で初期値を渡しています。
- CalendarForm(initial = default_data)のように、formを使用する際にパラメータで初期値を渡して設定。
- calendar_form.fields[‘start_date’].label、calendar_form.fields[‘start_date’].widgetのように、具体的なパラメタを渡すことで初期設定。
# views.py
class GraphView(LoginRequiredMixin, ModelFormMixin, generic.DetailView):
model = Location
template_name = 'monitor/graph.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Form(カレンダー入力)
min_date = '2018/10/10'
default_data = {'start_date': min_date,
'end_date': (dt.now() + timedelta(days = 1)).strftime('%Y/%m/%d')} # カレンダー初期値の設定
calendar_form = CalendarForm(initial = default_data)
calendar_form.fields['start_date'].label = "開始日時!"
calendar_form.fields['start_date'].widget = datetimepicker.DateTimePickerInput(
format='%Y/%m/%d %H:%M:%S',
options={
'locale': 'ja',
'dayViewHeaderFormat': 'YYYY年 MMMM',
'ignoreReadonly': True,
'allowInputToggle': True,
'minDate': min_date, # 最小日時
}
).start_of('term')
calendar_form.fields["end_date"].widget = datetimepicker.DateTimePickerInput(
format='%Y/%m/%d %H:%M:%S',
options={
'locale': 'ja',
'dayViewHeaderFormat': 'YYYY年 MMMM',
'ignoreReadonly': True,
'allowInputToggle': True,
'maxDate': (dt.now() + timedelta(days = 1)).strftime('%Y/%m/%d %H:%M:%S'), # 最大日時(翌日)
}
).end_of('term')
context['calendar_form'] = calendar_form
return context
実行結果
ラベルと指定通りの初期値が設定されていることがわかります。
わかりにくいですが、widgetのoptionsで’minDate’を指定したため、’2018/10/10’より前の日時は選択できないようになっています。
同様に、widgetのoptionsで’maxDate’を指定したため、終了日時は’翌日の00:00:00’より大きい値を指定できないようになっています。




