【问题标题】:Displaying fields other than pk in a Django Form with a ModelChoiceField使用 ModelChoiceField 在 Django 表单中显示 pk 以外的字段
【发布时间】:2020-01-02 03:51:15
【问题描述】:

我正在建立一个网站,用户可以在其中上传文件,并将上传内容附加到他们事先创建的项目中。上传是使用 django 表单完成的,用户可以在其中指定标题、cmets 等...还有一个下拉列表,用户可以从他创建的现有项目中进行选择(项目列表取决于用户) 截至目前,下拉列表仅显示(自动生成的)项目 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--')

forms.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']

【问题讨论】:

    标签: python django django-forms modelchoicefield


    【解决方案1】:

    根据文档

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

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

    所以你应该为Project模型定义__str__() method,例如

    def __str__(self):
        return self.name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2014-08-24
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 2012-03-02
      相关资源
      最近更新 更多