[英]Displaying fields other than pk in a Django Form with a ModelChoiceField
我正在建立一个网站,用户可以在其中上传文件,也可以将上传内容附加到他们事先创建的项目中。 上载是使用django表单完成的,用户可以在其中指定标题,评论等。还有一个下拉列表,用户可以在其中从他创建的现有项目中进行选择(项目列表取决于用户)。现在,下拉列表仅显示(自动生成的)项目ID,即模型Project的pk。
我希望下拉列表显示项目名称,而不是项目ID,这对用户而言意义不大。
我已经尝试过
to_field_name='name'
但这没用
我也尝试过
Project.objects.filter(user=user).values_list('name')
or
Project.objects.filter(user=user).values('name')
最后两个选项在{'projectname}中显示项目名称,但是当我选择它们并提交表单时,错误“选择一个有效的选择。该选择不是可用的选择之一”。
这是我的代码:
models.py
class Upload(models.Model):
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
upload_date = models.DateTimeField(default=timezone.now)
comments = models.CharField(max_length=10000, null=True)
title = models.CharField(max_length=10000, null=True)
project = models.CharField(max_length=99, default='--None--')
表格
class UploadForm(ModelForm):
project = ModelChoiceField(label='Select Project', queryset=Project.objects.all(), to_field_name='name',
empty_label='--Select Project--')
def __init__(self, *args, **kwargs):
user = kwargs.pop('user', None)
super(UploadForm, self).__init__(*args, **kwargs)
if user is not None:
self.fields['project'].queryset = Project.objects.filter(user=user)
class Meta:
model = Upload
fields = ['title', 'project', 'upload_date', 'comments']
根据文档
将调用模型的str ()方法以生成对象的字符串表示形式,以供在字段的选择中使用。 要提供自定义表示,请子类ModelChoiceField并重写label_from_instance。 此方法将接收模型对象,并应返回适合于表示它的字符串。
https://docs.djangoproject.com/zh-CN/2.2/ref/forms/fields/#modelchoicefield
因此,您应该为Project
模型定义__str__() method
,例如
def __str__(self):
return self.name
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.