DjangoのForm項目のchoicesにDBから値を取得し設定する場合は、コンストラクタ内で設定しないとエラーが発生する話
この記事では、Form項目のchoicesにDBから取得した値を設定する方法を説明します。
この記事では、Form項目のchoicesにDBから取得した値を設定する方法を説明します。
この記事の内容です。
対象読者
- Form項目のchoisesにDBから取得した値を設定したい方
環境
- Django (version 4.1.2, 3.2.16)
前提条件
なし
Form項目のchoisesにDBから取得した値を設定する方法
DjangoのFormでは、直接メンバーフィールドのchoicesにModel.objects.values_listなどでDBから取得した値を設定しようとすると、エラーが発生します。
それを回避するため、以下の様にコンストラクタ内で設定する必要があるというところに行きついたので、共有します。
もし他に良い方法がある方が居たら、コソッと教えていただけると嬉しいです。
以下の例は、HogeフォームでDBから取得した国リストをドロップダウンリスト形式で表示したい時の設定です。
値も表記も両方、国名にしています。
要求や仕様に応じて、自由にカスタマイズして使っていただければと思います。
from django import forms
class HogeForm(BaseModelForm):
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=ErrorList, label_suffix=None, empty_permitted=False, instance=None, use_required_attribute=None, renderer=None, readonly=False):
self.base_fields['countries'] = forms.fields.ChoiceField(
choices=Country.objects.values_list("name", "name"),
required=True,
widget=forms.widgets.Select(),
label='国'
)
super().__init__(data, files, auto_id, prefix, initial, error_class, label_suffix, empty_permitted, instance, use_required_attribute, renderer, readonly)
class Meta:
model = Hoge