Django Logo

[Django]Form に初期値を設定する方法

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.pyView クラスの中で 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 }}

すると、
Django Form 1

このようにフォームの各部品に初期値が設定されます。

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')

画面はこんな感じになります。
Django Form 2

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)

画面はこのようになります。
Django Form 3

それぞれの設定方法の使いどころについて

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 に初期値を設定する方法はいろいろありますが、それぞれの設定方法の特徴を活かした実装を心がけたいですね。

「[Django]Form に初期値を設定する方法」への2件のフィードバック

  1. ピンバック: Djangoテンプレートにフォーム初期値を設定する3パターン – SE-NOTEBOOK

  2. ピンバック: テンプレートにフォーム初期値を設定する3パターン – SE-NOTEBOOK

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です