Django - ModelChoiceField 的 queryset 如何工作?

12

我有一个表单,其中包含一个ModelChoiceField字段,我想从我的数据库中加载一个表格。如果我在表单的初始化中使用此查询集,则我的视图的form.is_valid函数可以正常工作:

self.fields['categoria_formfield'].queryset = sitio_categoria.objects.exclude(categoria='patrimonio').values_list('idCategoria',flat=True)

在此输入图片描述

这段代码展示了一个ModelChoiceField中的id列表,但我需要展示分类列表。因此我使用了以下代码:

self.fields['categoria_formfield'].queryset = sitio_categoria.objects.exclude(categoria='patrimonio').values_list('categoria',flat=True)
但是使用这个代码 .is_valid 不会验证,我收到一个表单错误:“选择一个有效的选项。该选择不是可用选项之一。” 有什么线索可以解决这个问题吗? 收到的错误 MODEL
class sitio_categoria(models.Model):
    idCategoria         =   models.AutoField(primary_key=True)
    categoria           =   models.CharField(max_length=30, null=False, unique=True)

表单

class anadirComercioPaso1_form(forms.Form):
        categoria_formfield = forms.ModelChoiceField(widget=forms.Select(attrs={'size':'13', 'onchange':'this.form.action=this.form.submit()'}), queryset=sitio_categoria.objects.none())

def __init__(self, *args, **kwargs):
        super(anadirComercioPaso1_form, self).__init__(*args,**kwargs)
        self.fields['categoria_formfield'].queryset = sitio_categoria.objects.exclude(categoria='patrimonio').values_list('categoria',flat=True)
1个回答

15

不要使用values_list(或values),ModelChoiceField需要实际的模型对象。

queryset = sitio_categoria.objects.exclude(categoria='patrimonio')

ModelChoiceField会使用对象的主键进行验证,并使用它们的Unicode表示形式进行显示。因此,您需要在模型中定义转换为Unicode的方法:

class sitio_categoria(models.Model):
    idCategoria = models.AutoField(primary_key=True)
    categoria = models.CharField(max_length=30, null=False, unique=True)

    def __unicode__(self):
        return self.categoria

 

ModelChoiceField 文档

该字段的选项将使用模型的 __unicode__ 方法生成对象的字符串表示形式;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接