Custom Templates Django Formwizard

有些话、适合烂在心里 提交于 2019-12-11 22:20:12

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!