model に定義してる __str__ は変更したくないけど
セレクトボックスに表示する文字列を変更したいケース
試した環境
- Windows10
- Django 2.2
- python 3.6.8
ModelChoiceField の作成
こんな model があって
models.py
class Person(models.Model):
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
age = models.IntegerField()
def __str__(self):
return f"{self.last_name} {self.first_name}"
ModelChoiceField を定義して
forms.py
class SampleForm(forms.Form):
persons = forms.ModelChoiceField(
queryset=Person.objects.all(),
)
表示すると model の __str__ で設定した文字列が表示される。
models.py
def __str__(self):
return f"{self.last_name} {self.first_name}"
セレクトボックスの表示だけ文字列を変更したい
セレクトボックスに表示する時だけ、「氏名 + 年齢」にしたい
model の __str__ を変更すると model を参照している箇所が全部変わってしまうので
ModelChoiceField を継承する
ModelChoiceField を継承したクラスを作成して
label_from_instance 内で表示したい文字列を定義する。
forms.py
class PersonChoiceField(forms.ModelChoiceField):
def label_from_instance(self, person):
return f"{person.last_name} {person.first_name} {person.age}歳"
class SampleForm(forms.Form):
persons = PersonChoiceField(
queryset=Person.objects.all(),
)
参考
ModelChoiceField の 一番下に書いてある(英語)
公式ドキュメント - ModelChoiceField