Django ';至"字段"名称';ModelChoiceField()上的参数不';我好像不工作

Django ';至"字段"名称';ModelChoiceField()上的参数不';我好像不工作,django,django-forms,Django,Django Forms,好吧,和标题里说的差不多 我正在我的一个表单中创建一个modelcooicefield(),如下所示: class FormCreatePlace(forms.ModelForm): (...) category = forms.ModelChoiceField(queryset=Category.objects.all(), to_field_name='name') (...) 类别模型的定义如下: class Category(models.Model):

好吧,和标题里说的差不多

我正在我的一个
表单中创建一个
modelcooicefield()
,如下所示:

class FormCreatePlace(forms.ModelForm):
    (...)
    category = forms.ModelChoiceField(queryset=Category.objects.all(), to_field_name='name')
    (...)
类别
模型的定义如下:

class Category(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=40)
然而HTML表单上的字段本身坚持显示主键(一系列UUID)作为选项


我做错了什么?

to_字段_name
用于更改选项的值,而不是显示的文本

更改显示文本的最简单方法是更改模型上的
\uu str\uu
方法,以返回
名称
字段:

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
但是,这将影响类别在其他位置的显示方式。如果您不想这样做,可以将
modelcooicefield
子类化,并覆盖来自\u实例的
label\u

class MyModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.name
然后在表单中使用您的选择字段

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

有关更多信息,请参阅文档。

这是一个非常好的回答,并提供了很好的建议,因为在我的模型上更改
\uuu str\uuuu
可能会在其他地方产生影响。谢谢阿拉斯代尔,谢谢你的建议。他们应该为displayname创建一个新的参数。默认的displayname对用户不友好,因此没有多少人会使用它。@Django开发人员邮件列表中的user3042674关于向模型选择字段添加参数。