嗯,几乎就是标题中所说的。
我正在创建一个 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)显示为选项。
我究竟做错了什么?
最佳答案
to_field_name
用于更改选项的值,而不是显示的文本
更改显示文本的最简单方法是更改 __str__
模型上返回 name
的方法 field :
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
文档以获取更多信息。
关于django - ModelChoiceField() 上的“to_field_name”参数似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49114304/