7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ModelChoiceFieldで__str__は変更せず、表示する文字列を変更する

Last updated at Posted at 2019-05-30

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}" 

こんな感じ
image00.png

セレクトボックスの表示だけ文字列を変更したい

セレクトボックスに表示する時だけ、「氏名 + 年齢」にしたい
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(),
    )

表示してみると
image01.png
年齢もセットで表示されるようになった。

参考

ModelChoiceField の 一番下に書いてある(英語)
公式ドキュメント - ModelChoiceField

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?