嗯,几乎就是它在标题中所说的内容。
我在我的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)作为选择。
我做错了什么?
答案 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
文档。