Django - ModelChoiceField查询集的工作原理如何?

Adr*_*pez 10 forms django validation dynamic-forms

我有一个带有ModelChoiceField的表单,我想从我的数据库中加载一个表.如果我在表单的init上使用此查询集,那么我的视图的form.is_valid工作正常:

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

在此输入图像描述

该代码显示了ModelChoiceField上的id列表,但我需要它来显示类别列表.所以我使用:

self.fields['categoria_formfield'].queryset = sitio_categoria.objects.exclude(categoria='patrimonio').values_list('categoria',flat=True)
Run Code Online (Sandbox Code Playgroud)

但是使用此代码.is_valid不会验证,我会收到一个表单错误:"选择一个有效的选择.这个选择不是可用的选择之一." 关于可能出现什么问题的一些线索?

收到错误

模型

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

形成

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)
Run Code Online (Sandbox Code Playgroud)

Pav*_*sov 15

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

queryset = sitio_categoria.objects.exclude(categoria='patrimonio')
Run Code Online (Sandbox Code Playgroud)

 

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
Run Code Online (Sandbox Code Playgroud)

 

ModelChoiceField文档

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