0

我有一个没有按预期工作的 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 类中提供元组的特定“字段”,反之亦然,使用“排除”指定不希望的字段,但没有运气。

我知道,这很模糊......但你能给我一些建议吗?

附言。与 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
4

1 回答 1

0

呜呜呜呜!!!!O___O'

3 小时后,我意识到问题出在表单的超类中!我有自己的 ModelForm,它扩展了 django 的 ModelForm,以便提供动态方法来使用 Bootstrap 模板(http://twitter.github.io/bootstrap/base-css.html#forms)呈现表单。所以在我的自定义模型中,我有一个allFieldsGroupedInDivs类似于“as_table”的方法,但使用具有特定类的 div 来显示数据......并且为了为复杂的表单提供更多的灵活性(我有几个字段,我想订购它们特别是)我最近实现了一个魔术方法(__getattr__),以便使用签名呈现单个表单字段thefieldGroupedInDivs(其中“thefield”是要呈现的字段的名称)。clean_field()所以我的数据没有被正确清理!当请求的方法不在表单中时,我只需调用超级实现即可解决*GroupedInDivs:)

总之:覆盖 DJANGO 的课程时要注意!

于 2013-05-31T16:56:26.230 回答