Koki's personal blog

Koki's personal blog

Another fine, responsive site template by HTML5 UP.

DjangoのForm項目のchoicesにDBから値を取得し設定する場合は、コンストラクタ内で設定しないとエラーが発生する話

この記事では、Form項目のchoicesにDBから取得した値を設定する方法を説明します。

Koki

2 分で読めます

この記事では、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

最近の投稿

カテゴリー