Django ModelForm验证问题(当假设为false时返回true)

时间:2013-05-31 14:42:13

标签: django django-forms

我有一个没有按预期工作的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

1 个答案:

答案 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:)

的形式时,我只是通过调用super实现来解决

总结:在超越DJANGO的课程时注意!