关于python:Django forms:无法调用form.clean

Django forms: cannot call form.clean

考虑以下堆栈跟踪:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
In [3]: f.clean()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
C:\\Users\\Marcin\\Documents\\oneclickcos\\lib\\site-packages\\django\\core\\management\\commands\\shell.pyc in <module>()
----> 1 f.clean()

C:\\Users\\Marcin\\Documents\\oneclickcos\\oneclickcos\\mainapp\\incorporate_helpers.pyc in clean(self)
    569         This checks the relations between fields, ensures consistent state, and exports bits about the state of the form that can be used in subsequent
validations
    570        """
--> 571         cleaned_data = super(IncorporateForm, self).clean()
    572         #logger.debug('IncorporationForm.cleaned_data: ' + str(cleaned_data))

    573         try:

C:\\Users\\Marcin\\Documents\\oneclickcos\\oneclickcos\\mainapp\\incorporate_helpers.pyc in clean(self)
    402
    403     def clean(self):
--> 404         cleaned_data = super(CreateForm, self).clean()
    405         # trying to use an empty pk can result in a ValueError. Easier to expunge.

    406         if cleaned_data.get('pk', None) == '': del cleaned_data['pk']

C:\\Users\\Marcin\\Documents\\oneclickcos\\lib\\site-packages\\django\\forms\\forms.pyc in clean(self)
    315         association with the field named '__all__'.
    316        """

--> 317         return self.cleaned_data
    318
    319     def has_changed(self):

AttributeError: 'IncorporateForm' object has no attribute 'cleaned_data'

(所有相关代码都显示在上面的跟踪中)。

我的代码符合 https://docs.djangoproject.com/en/1.4/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other 中的示例;但是,似乎 BaseForm 返回期望 cleaned_data 存在。

我在文档中没有看到在调用 clean 之前创建 cleaned_data 是用户代码的责任。是什么赋予了?这是 Django 中的错误吗?

django 1.4 和 1.3.1 出现错误。


您根本不应该直接调用 clean。你应该调用 form.is_valid().


据我所知,文档从不建议您直接调用 form.clean()。大多数时候(一直?),你想调用 form.is_valid()

在底层,调用 is_valid() 会导致调用 full_clean() 方法,该方法设置 cleaned_data.