Marcin
Marcin

Reputation: 49886

Django forms: cannot call form.clean

Consider the following stacktrace:

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'

(All relevant code is shown in the trace above).

My code conforms to the examples at https://docs.djangoproject.com/en/1.4/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other; however, it seems that BaseForm returns expects cleaned_data to exist.

Nowhere in the documentation do I see that it is the responsibility of user code to create cleaned_data before calling clean. What gives? Is this a bug in Django?

Error appears with django 1.4 and 1.3.1.

Upvotes: 1

Views: 250

Answers (2)

Alasdair
Alasdair

Reputation: 309129

As far as I can see the docs never suggest that you call form.clean() directly. Most of the time (all the time?), you want to call form.is_valid().

Under the hood, calling is_valid() leads to the full_clean() method being called, which sets cleaned_data.

Upvotes: 2

Daniel Roseman
Daniel Roseman

Reputation: 600059

You shouldn't call clean directly at all. You should call form.is_valid().

Upvotes: 3

Related Questions