在Django表单中设置动态选项时的验证

4 投票
1 回答
1776 浏览
提问于 2025-04-18 06:50

几个小时前我遇到了一点小问题,我想在用户提交表单后保存数据。

问题在于,我是动态设置多选框的选项,也就是说,在调用__init__方法之后才设置的。这种做法在很多StackOverflow的回答中都有提到。

问题就出现在数据被清理的时候,因为在调用clean()方法时没有选项,所以我收到了一个正常的错误提示:“请选择一个有效的选项,等等。”

编辑:问题的一个例子

之前的代码(不工作):

class myForm(forms.Form):

    myField = forms.MultipleChoiceField()

    def __init__(self, *args, **kwargs):
        self.some_data = kwargs.pop('some_data')
        super(myForm, self).__init__(*args, **kwargs)

        dynamicChoices = Objects.objects.filter(some_filter=self.some_data)
        self.fields['myField'] = forms2.MultipleChoiceField(choices=dynamicChoices)

1 个回答

3

经过一番研究和无数次的挫折,我终于找到了一个解决办法。需要再次在表单上调用清理方法。根据这篇django文档,可以帮助我的方法是full_clean()

值得一提的是,我使用的动态选项并不需要特别的验证,问题在于当用户提交选择后,在构建表单时,比较选项时没有为字段分配任何选择。

下面是使用full_clean()方法的代码,这样一切就能正常工作了。

class myForm(forms.Form):

    myField = forms.MultipleChoiceField()

    def __init__(self, *args, **kwargs):
        self.some_data = kwargs.pop('some_data')
        super(myForm, self).__init__(*args, **kwargs)

        dynamicChoices = Objects.objects.filter(some_filter=self.some_data)
        self.fields['myField'] = forms2.MultipleChoiceField(choices=dynamicChoices)

        super(myForm, self).full_clean()

撰写回答