🙆

[Django]FKのModelChoiceFieldの選択肢がObjectになる

2024/03/07に公開

概要

ChoiceFieldの項目をDBから取得する場合にテンプレート側で選択肢がオブジェクトになる件の対応方法を紹介。

環境

Python 3.12.2
Django 5.0.2

現象

テンプレート(html)を表示すると、選択肢がオブジェクトになる。
例:MyRelatedClass Object(1)

対応方法

ModelChoiceFieldをオーバーライドして、label_form_instanceでobjectではなくobject.nameをreturnするよう変更

# forms.py
class CustomModelChoiceField(forms.ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.name
class xxForm(forms.ModelForm):
    choicefield = CustomModelChoiceField(queryset=xxxxClass.objects.all(), empty_label='', required=True)

# views.py
class xxxView(CreateView):
    def get(self, request, **kwargs):
        form = xxxForm()
        form.fields['xxx'].queryset = xxxx.objects.all().filter(xxx=self.request.user)
        datas = {'form': form}
        return render(self.request,self.template_name, datas)

# template
{% for object in object_list %}
<tr>
    <td>{{ object.columnName.columnName }}</td>

Discussion