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つの方法で初期値を渡しています。

  1. CalendarForm(initial = default_data)のように、formを使用する際にパラメータで初期値を渡して設定。
  2. 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’より大きい値を指定できないようになっています。


Django

コメントを残す

メールアドレスが公開されることはありません。