Opened 13 years ago
Closed 12 years ago
#20056 closed Bug (duplicate)
get_cleaned_data_for_step & condition_dict in FormWizard
| Reported by: | Owned by: | nobody | |
|---|---|---|---|
| Component: | contrib.formtools | Version: | 1.5 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
I made a FormWizard, exactly like that from the Documentation and I found a problem with "get_cleaned_data_for_step" and condition_dict. I don't know this is a Bug in django, or maybe I make a mistake.
Here the Code:
urls.py
# ...
url(r'^wizard/$',
ContactWizard.as_view(contact_forms, condition_dict={"1": show_message_form_condition}))
# ...
forms.py
from django import forms
class ContactForm1(forms.Form):
subject = forms.CharField(max_length=100)
sender = forms.EmailField()
leave_message = forms.BooleanField(required=False)
class ContactForm2(forms.Form):
message = forms.CharField(widget=forms.Textarea)
views.py
from django.shortcuts import render_to_response
from django.contrib.formtools.wizard.views import SessionWizardView
def show_message_form_condition(wizard):
# try to get the cleaned data of step 1
cleaned_data = wizard.get_cleaned_data_for_step('0') or {}
# check if the field ``leave_message`` was checked.
return cleaned_data.get('leave_message', True)
class ContactWizard(SessionWizardView):
template_name = "wizard.html"
def get_form_kwargs(self, step=None):
print "get_form_kwargs"
kwargs = super(ContactWizard, self).get_form_kwargs(step)
return kwargs
def done(self, form_list, **kwargs):
return render_to_response('/', {
'form_data': [form.cleaned_data for form in form_list],
})
You see, the ContactWizard is like that from the documentation.
I just override and put in "get_form_kwargs" a print statement.
If I load the page at Firefox, fill out the fields from the first step and click to the next step. This is how the console looks like:
get_form_kwargs get_form_kwargs get_form_kwargs get_form_kwargs get_form_kwargs [15/Mar/2013 23:53:19] "GET /wizard/ HTTP/1.1" 200 900 get_form_kwargs get_form_kwargs get_form_kwargs get_form_kwargs get_form_kwargs get_form_kwargs get_form_kwargs get_form_kwargs get_form_kwargs [15/Mar/2013 23:53:27] "POST /wizard/ HTTP/1.1" 200 806
I know, this is because of "get_cleaned_data_for_step('0')" and get_form_list() in formtools.wizard.views but I don't know how I avoid the multiple calls of get_form_list. If there is a query in a ModelForm, for example for a select field, the loop of get_form_kwargs call it multiple times.
I don't know what needs so many get_form_kwargs calls?
I hope someone make a look at this, because I have bad python skills.
And sorry for my bad english :(
Change History (7)
comment:1 by , 13 years ago
comment:2 by , 13 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
Hi. Have a look at ticket:18803#comment:1 which is similar to yours. The conclusion is that this behaviour is not a bug.
comment:3 by , 13 years ago
| Resolution: | fixed → invalid |
|---|
follow-up: 5 comment:4 by , 13 years ago
| Type: | Uncategorized → Bug |
|---|
This is definitiv a bug. The condition_dict is not usable with this.
comment:5 by , 12 years ago
| Version: | 1.4 → 1.5 |
|---|
I agree this should be solved.
My wizard has two simple conditions for three different steps.
Basically ‘user is professional or private’ set in step two.
Handling step 3 queries the database twenty times for a —already validated— user.
form_obj.is_valid(), clean_username, form_obj.is_valid(), clean_username, form_obj.is_valid(), clean_username, form_obj.is_valid(), clean_username...........
comment:6 by , 12 years ago
| Resolution: | invalid |
|---|---|
| Status: | closed → new |
comment:7 by , 12 years ago
| Resolution: | → duplicate |
|---|---|
| Status: | new → closed |
It doesn't appear to me that anyone complaining about this has done more investigation than lrekucki did in #18803 so I'm going to re-close it. If you want to reopen, please investigate this more and demonstrate how the problem can be solved.
why is this still unreviewed?