问题
This may be obvious to some, but I cannot figure out how to over-ride get_template_name
to provide a different template to the different steps of my form wizard
. Here is what I have so far:
class StepOneForm(forms.Form):
color = forms.ChoiceField(choices=COLOR_CHOICES)
...
class StepTwoForm(forms.Form):
main_image = forms.ImageField()
...
class StepThreeForm(forms.Form):
condition = forms.ChoiceField(choices=CONDITION)
...
class CreateWizard(SessionWizardView):
file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT))
def done(self, form_list, **kwargs):
id = form_list[0].cleaned_data['id']
try:
thing = Thing.objects.get(pk=id)
instance = thing
except:
thing = None
instance = None
if thing and thing.user != self.request.user:
raise HttpResponseForbidden()
if not thing:
instance = Thing()
for form in form_list:
for field, value in form.cleaned_data.iteritems():
setattr(instance, field, value)
instance.user = self.request.user
instance.save()
return render_to_response('wizard-done.html', {
'form_data': [form.cleaned_data for form in form_list],})
urls.py:
url(r'^create/$', login_required(CreateWizard.as_view([StepOneForm, StepTwoForm, StepThreeForm])), name='create_thing'),
I have read the Django docs and tried to use the method described there. In my forms.py:
FORMS = [("step_one", myapp.forms.StepOneForm),
("step_two", myapp.forms.StepTwoForm),
("step_three", myapp.forms.StepThreeForm)]
TEMPLATES = {"step_one": "myapp/step-one.html",
"step_two": "myapp/step-two.html",
"step_three": "myapp/step-three.html"}
class CreateWizard(SessionWizardView):
def get_template_names(self):
return [TEMPLATES[self.steps.current]]
...etc. ...
But this returns a KeyError at u'0'
. How can I get my form wizard to display different templates for each step?
回答1:
The steps in django form wizard are as '0', '1', '2', ...
so you need to update your TEMPLATES
dict as
TEMPLATES = {"0": "myapp/step-one.html",
"1": "myapp/step-two.html",
"2": "myapp/step-three.html"}
And then use it get_template_names
as you have done:
class CreateWizard(SessionWizardView):
def get_template_names(self):
return [TEMPLATES[self.steps.current]]
来源:https://stackoverflow.com/questions/18972436/custom-templates-django-formwizard