Opened 12 years ago
Closed 11 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 , 12 years ago
comment:2 by , 12 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 , 12 years ago
Resolution: | fixed → invalid |
---|
follow-up: 5 comment:4 by , 12 years ago
Type: | Uncategorized → Bug |
---|
This is definitiv a bug. The condition_dict is not usable with this.
comment:5 by , 11 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 , 11 years ago
Resolution: | invalid |
---|---|
Status: | closed → new |
comment:7 by , 11 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?