繁体   English   中英

使用ModelChoiceField在Django表单中显示pk以外的其他字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM