' to_field_name' ModelChoiceField()上的参数似乎不起作用

时间:2018-03-05 15:50:05

标签: django django-forms

嗯,几乎就是它在标题中所说的内容。

我在我的ModelChoiceField()之一中创建Forms,如下所示:

class FormCreatePlace(forms.ModelForm):
    (...)
    category = forms.ModelChoiceField(queryset=Category.objects.all(), to_field_name='name')
    (...)

Category模型的定义如下:

class Category(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=40)

然而,HTML表单上的字段本身仍然坚持显示主键(一系列UUID)作为选择。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

to_field_name用于更改选项的值,而不是显示的文本

更改显示文字的最简单方法是更改​​模型上的__str__方法以返回name字段:

class Category(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=40)

    def __str__(self):
        return self.name

但是,这会影响类别在其他地方的显示方式。如果您不想这样做,可以继承ModelChoiceField并覆盖label_from_instance

class MyModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.name

然后在表单中使用您的选择字段。

class FormCreatePlace(forms.ModelForm):
    (...)
    category = forms.MyModelChoiceField(queryset=Category.objects.all())

有关详细信息,请参阅ModelChoiceField文档。