我有一个没有按预期工作的ModelForm。即使对于空字段,方法is_valid()
也返回True,而且在clenead_data
中我没有预期的字段,但只有一个不应该存在的字段(因为表单不呈现)。
我的场景是这样的:
我的表单类:
class MyForm(ModelForm):
class Meta:
model = MyModel
# fields = ('one', 'two', 'three')
widgets = {
'fieldA': SelectDateWidget(),
'fieldB': forms.HiddenInput(),
# ...
}
fieldX = forms.ChoiceField(widget=forms.RadioSelect(),
choices=(...),
initial=A_VALUE)
fieldY = forms.ChoiceField(widget=forms.RadioSelect(),
choices=(...),
initial=A_VALUE)
表单按预期呈现在页面中并使用POST提交(所有数据都已正确提交)。然后在我的控制器中我有类似的东西:
self.form = MyForm(request.POST)
在调用self.form.cleaned_data
之后,和is_valid()
内部只有一个字段(它是属于模型的字段,但在表单中是意外的)。
我还尝试声明在Meta类中提供元组的特定“字段”,反之,使用“exclude”指定不需要的元素,但没有运气。
我知道,这很模糊......但你可以给我一些建议吗?
PS。与ModelForm相同的方法在我项目的其他部分完美运行:P
...此外,如果我打开交互式shell(python manage.py shell
)并尝试以下操作:
f = MyForm({})
f.is_valid()
我得到以下异常:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/davidezanotti/MyPythonEnv/lib/python2.7/site-packages/django/forms/forms.py", line 126, in is_valid
return self.is_bound and not bool(self.errors)
File "/Users/davidezanotti/MyPythonEnv/lib/python2.7/site-packages/django/forms/forms.py", line 117, in _get_errors
self.full_clean()
File "/Users/davidezanotti/MyPythonEnv/lib/python2.7/site-packages/django/forms/forms.py", line 272, in full_clean
self._clean_fields()
File "/Users/davidezanotti/MyPythonEnv/lib/python2.7/site-packages/django/forms/forms.py", line 290, in _clean_fields
value = getattr(self, 'clean_%s' % name)()
TypeError: 'NoneType' object is not callable
答案 0 :(得分:0)
Fuuuuuuuuu !!!! ø___ O'
3个小时后,我意识到问题出在表格的超类中!我有自己的ModelForm,它扩展了django的ModelForm,以便使用Bootstrap模板(http://twitter.github.io/bootstrap/base-css.html#forms)提供动态方法来呈现表单。
所以在我的自定义模型中,我有一个类似于“as_table”的allFieldsGroupedInDivs
方法,但是使用具有特定类的div来显示数据......以及为复杂表单提供更多灵活性(我有几个字段和我想以特定方式对它们进行排序)我最近实现了一种魔术方法(__getattr__
),以便使用签名thefieldGroupedInDivs
呈现单个表单字段(其中“thefield”是字段的名称)渲染)。问题是Django使用这种魔术方法来动态创建各种clean_field()
所以我的数据没有被正确清理!当请求的方法不是*GroupedInDivs
:)
总结:在超越DJANGO的课程时注意!