DjangoのModelChoiceFieldでIDではなく値を使用する方法


  1. モデルの__str__メソッドをオーバーライドするか、選択肢として表示したいフィールドに対して__str__メソッドを定義します。例えば、次のようなモデルがあるとします。
class MyModel(models.Model):
    name = models.CharField(max_length=100)
    # 他のフィールドも定義されているとします
    def __str__(self):
        return self.name

上記の例では、nameフィールドの値が選択肢として表示されるようになります。

  1. フォームクラスでModelChoiceFieldを使用し、to_field_nameを指定します。to_field_nameは、モデルのフィールド名を指定することで、そのフィールドの値を選択肢として使用します。例えば、次のようなフォームクラスを作成します。
from django import forms
from .models import MyModel
class MyForm(forms.Form):
    my_field = forms.ModelChoiceField(
        queryset=MyModel.objects.all(),
        to_field_name='name'
    )

上記の例では、my_fieldフィールドの選択肢として、MyModelnameフィールドの値が使用されます。

これで、ModelChoiceFieldの選択肢としてIDではなく他のフィールドの値を表示することができます。選択された値は、通常の方法で取得できます。