diff --git a/django/contrib/formtools/wizard/views.py b/django/contrib/formtools/wizard/views.py index 4379e6cdeb..17cfa6baa7 100644 --- a/django/contrib/formtools/wizard/views.py +++ b/django/contrib/formtools/wizard/views.py @@ -265,11 +265,7 @@ class WizardView(TemplateView): # form. (This makes stepping back a lot easier). wizard_goto_step = self.request.POST.get('wizard_goto_step', None) if wizard_goto_step and wizard_goto_step in self.get_form_list(): - self.storage.current_step = wizard_goto_step - form = self.get_form( - data=self.storage.get_step_data(self.steps.current), - files=self.storage.get_step_files(self.steps.current)) - return self.render(form) + return self.render_goto_step(wizard_goto_step) # Check if form was refreshed management_form = ManagementForm(self.request.POST, prefix=self.prefix) @@ -317,6 +313,17 @@ class WizardView(TemplateView): self.storage.current_step = next_step return self.render(new_form, **kwargs) + def render_goto_step(self, goto_step, **kwargs): + """ + This method gets called when the current step has to be changed. + `goto_step` contains the requested step to go to. + """ + self.storage.current_step = goto_step + form = self.get_form( + data=self.storage.get_step_data(self.steps.current), + files=self.storage.get_step_files(self.steps.current)) + return self.render(form) + def render_done(self, form, **kwargs): """ This method gets called when all forms passed. The method should also @@ -660,8 +667,7 @@ class NamedUrlWizardView(WizardView): """ wizard_goto_step = self.request.POST.get('wizard_goto_step', None) if wizard_goto_step and wizard_goto_step in self.get_form_list(): - self.storage.current_step = wizard_goto_step - return redirect(self.get_step_url(wizard_goto_step)) + return self.render_goto_step(wizard_goto_step) return super(NamedUrlWizardView, self).post(*args, **kwargs) def get_context_data(self, form, **kwargs): @@ -682,6 +688,14 @@ class NamedUrlWizardView(WizardView): self.storage.current_step = next_step return redirect(self.get_step_url(next_step)) + def render_goto_step(self, goto_step, **kwargs): + """ + This method gets called when the current step has to be changed. + `goto_step` contains the requested step to go to. + """ + self.storage.current_step = goto_step + return redirect(self.get_step_url(goto_step)) + def render_revalidation_failure(self, failed_step, form, **kwargs): """ When a step fails, we have to redirect the user to the first failing diff --git a/docs/ref/contrib/formtools/form-wizard.txt b/docs/ref/contrib/formtools/form-wizard.txt index f8d46fd291..0032eeb5d8 100644 --- a/docs/ref/contrib/formtools/form-wizard.txt +++ b/docs/ref/contrib/formtools/form-wizard.txt @@ -469,6 +469,17 @@ Advanced ``WizardView`` methods def process_step_files(self, form): return self.get_form_step_files(form) +.. method:: WizardView.render_goto_step(step, goto_step, **kwargs) + + .. versionadded:: 1.6 + + This method is called when the step should be changed to something else + than the next step. By default, this method just stores the requested + step ``goto_step`` in the storage and then renders the new step. + + If you want to store the entered data of the current step before rendering + the next step, you can overwrite this method. + .. method:: WizardView.render_revalidation_failure(step, form, **kwargs) When the wizard thinks all steps have passed it revalidates all forms with