我有一个带有ModelChoiceField的表单,我想从我的数据库中加载一个表。如果我在表单的初始化中使用此查询集,则 View 的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)

最佳答案

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

关于Django-ModelChoiceField查询集如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15603249/

10-13 04:17