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’より大きい値を指定できないようになっています。