Django - ModelChoiceField 查询集如何工作?

Posted

技术标签:

【中文标题】Django - ModelChoiceField 查询集如何工作?【英文标题】:Django - How ModelChoiceField queryset's works? 【发布时间】:2013-03-14 06:02:58 【问题描述】:

我有一个带有 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 不验证,我收到一个表单错误:“选择一个有效的选择。该选择不是可用的选择之一。”关于可能是什么问题的一些线索?

型号

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】:

不要使用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 documentation

将调用模型的__unicode__ 方法来生成对象的字符串表示形式,以用于字段的选择;

【讨论】:

以上是关于Django - ModelChoiceField 查询集如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

表单 ModelChoiceField 查询集 + 额外选择字段 django 表单

Django - ModelChoiceField 查询集如何工作?

Django ModelChoiceField 的问题

Django:让 ModelChoiceField 在运行时评估查询集

Django 表单不使用 ModelChoiceField 保存 - ForeignKey

带有modelchoicefield的Django多个表单->查询太多