在Django表单中设置动态选项时的验证
几个小时前我遇到了一点小问题,我想在用户提交表单后保存数据。
问题在于,我是动态设置多选框的选项,也就是说,在调用__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()