[Python][Django]FormSetのセレクトボックスに初期値を設定する方法

目的・やりたかったこと

FormSet のセレクトボックスに任意の初期値を設定したい
Modelで定義している選択肢をそのまま要素として設定する方法を紹介します。

結論

Formクラスの __init__ メソッド内で初期値を設定できます。

self.fields['[field_name]'].choices = [('', '選択してください')] + list([Model]._meta.get_field('[field_name]').choices)

サンプル コード

以下のコードで設定できます。
前提となる Model から定義していきます。

models.py

class City(models.Model):
    prefectures = models.CharField(
        verbose_name=('都道府県'), 
        blank=True,
        null=True,
        max_length=1, 
        choices=(
            ('1', '北海道'),
            ('2', '青森県'),
            ... 
        )  # セレクトボックスに設定される要素
    )
    name = models.CharField(
        verbose_name=("市区町村"),
        null=True,
        blank=True,
        max_length=100
    )

forms.py

class CityForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(CityForm, self).__init__(*args, **kwargs)
        # 赤文字の部分のように記述することで、初期値を設定できる
        self.fields['prefectures'].choices = [('', '選択してください')] + list(City._meta.get_field('prefectures').choices)

    class Meta():
        model = City
        fields = ('prefectures', 'name')

CityFormSet = formset_factory(
    CityForm,
    extra=1
)

views.py

context['formset'] = CityFormSet()

コメント

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