0

我正在建立一个网站,用户可以在其中上传文件并将上传内容附加到他们事先创建的项目中。上传是使用 django 表单完成的,用户可以在其中指定标题、评论等...还有一个下拉列表,用户可以在其中从他创建的现有项目中进行选择(项目列表取决于用户)作为现在下拉列表仅显示(自动生成的)项目 ID,它是模型项目的 pk。

我希望下拉菜单显示项目的名称,而不是项目 ID,这对用户来说不是很有意义。

我已经试过了

to_field_name='name' 

但这没有用

我也试过

Project.objects.filter(user=user).values_list('name')

or

Project.objects.filter(user=user).values('name')

最后两个选项在 {'projectname} 中显示项目名称,但是当我选择它们并提交表单时出现错误“选择一个有效的选择。该选择不是可用的选择之一。”

这是我的代码:

模型.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--')

表格.py

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']
4

1 回答 1

2

根据文档

将调用模型的str () 方法来生成对象的字符串表示形式,以用于字段的选择。为了提供自定义的表示,子类 ModelChoiceField 并覆盖 label_from_instance。此方法将接收模型对象并应返回适合表示它的字符串。

https://docs.djangoproject.com/en/2.2/ref/forms/fields/#modelchoicefield

所以你应该__str__() methodProject模型定义,例如

def __str__(self):
    return self.name
于 2019-08-28T22:10:02.003 回答