ソフトウェア開発 プログラミング

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

ソフトウェア開発
この記事は約5分で読めます。
スポンサーリンク

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 }}

すると、

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

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

スポンサーリンク
スポンサーリンク
KoEをフォローする
CodeLab

コメント

タイトルとURLをコピーしました