Django ModelChoiceField,动态查询集的验证

时间:2017-05-31 16:02:43

标签: python django python-2.7 django-forms

我有这样的表格:

class PersonForm(forms.Form):                                                                                           
    article = forms.CharField(required=False)
    workshop = forms.ModelChoiceField(queryset=Program.objects.none(),
                                      empty_label="----",
                                      required=False,
                                      label='Atelier')

    def __init__(self, *args, **kwargs):                                                                                    
        super(PersonForm, self).__init__(*args, **kwargs)
        article = self.initial.get('article', None)
        if article:
            a = Article.objects.get(pk=article)
            if a.workshop:
                self.fields['workshop'].queryset = Program.objects.filter(event=a.event, workshop=True)
                self.fields['workshop'].required = True
                self.helper.layout.insert(4, Row1Field('workshop',))

用于检索所有研讨会的查询集是动态的,因此ModelChoiceField中的queryset属性设置为Program.objects.none(),动态查询集在表单的__init__方法

内完成

一切正常:select中workshop显示的所有值都可以。但是当我发布表单时,会出现验证错误:'Select a valid choice. This choice is not among available choices.'

有什么我想念的吗?

1 个答案:

答案 0 :(得分:0)

根据发布时实例化表单的代码,可能不会传递initial。你可以尝试:

article = self.initial.get('article', None) or self.data.get('article', None)

这将从您的表单POST数据中获取pk。