From 355f7fc564cb4dc67a84075664bf98ac203d2b13 Mon Sep 17 00:00:00 2001 From: Julien Phalip Date: Mon, 19 Dec 2011 13:36:32 +0000 Subject: [PATCH] Fixed #17163 -- Added the `NamedUrlWizardView.get_step_url()` method. Thanks, Bradley Ayers. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17235 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/formtools/wizard/views.py | 19 ++++++++++--------- docs/ref/contrib/formtools/form-wizard.txt | 16 ++++++++++++++-- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/django/contrib/formtools/wizard/views.py b/django/contrib/formtools/wizard/views.py index c5fab17f07..aac29bf6ab 100644 --- a/django/contrib/formtools/wizard/views.py +++ b/django/contrib/formtools/wizard/views.py @@ -591,6 +591,9 @@ class NamedUrlWizardView(WizardView): 'step name "%s" is reserved for "done" view' % initkwargs['done_step_name'] return initkwargs + def get_step_url(self, step): + return reverse(self.url_name, kwargs={'step': step}) + def get(self, *args, **kwargs): """ This renders the form or, if needed, does the http redirects. @@ -604,10 +607,8 @@ class NamedUrlWizardView(WizardView): query_string = "?%s" % self.request.GET.urlencode() else: query_string = "" - next_step_url = reverse(self.url_name, kwargs={ - 'step': self.steps.current, - }) + query_string - return redirect(next_step_url) + return redirect(self.get_step_url(self.steps.current) + + query_string) # is the current step the "done" name/view? elif step_url == self.done_step_name: @@ -636,7 +637,7 @@ class NamedUrlWizardView(WizardView): # invalid step name, reset to first and redirect. else: self.storage.current_step = self.steps.first - return redirect(self.url_name, step=self.steps.first) + return redirect(self.get_step_url(self.steps.first)) def post(self, *args, **kwargs): """ @@ -646,7 +647,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.url_name, step=wizard_goto_step) + return redirect(self.get_step_url(wizard_goto_step)) return super(NamedUrlWizardView, self).post(*args, **kwargs) def get_context_data(self, form, **kwargs): @@ -665,7 +666,7 @@ class NamedUrlWizardView(WizardView): """ next_step = self.get_next_step() self.storage.current_step = next_step - return redirect(self.url_name, step=next_step) + return redirect(self.get_step_url(next_step)) def render_revalidation_failure(self, failed_step, form, **kwargs): """ @@ -673,7 +674,7 @@ class NamedUrlWizardView(WizardView): step. """ self.storage.current_step = failed_step - return redirect(self.url_name, step=failed_step) + return redirect(self.get_step_url(failed_step)) def render_done(self, form, **kwargs): """ @@ -681,7 +682,7 @@ class NamedUrlWizardView(WizardView): name doesn't fit). """ if kwargs.get('step', None) != self.done_step_name: - return redirect(self.url_name, step=self.done_step_name) + return redirect(self.get_step_url(self.done_step_name)) return super(NamedUrlWizardView, self).render_done(form, **kwargs) diff --git a/docs/ref/contrib/formtools/form-wizard.txt b/docs/ref/contrib/formtools/form-wizard.txt index 58cb0e28d2..a3d9673db9 100644 --- a/docs/ref/contrib/formtools/form-wizard.txt +++ b/docs/ref/contrib/formtools/form-wizard.txt @@ -557,8 +557,8 @@ an ``instance_dict`` argument that should contain instances of ``ModelForm`` and ``ModelFormSet``. Similarly to :attr:`~WizardView.initial_dict`, these dictionary key values should be equal to the step number in the form list. -Usage of NamedUrlWizardView -=========================== +Usage of ``NamedUrlWizardView`` +=============================== .. class:: NamedUrlWizardView @@ -595,3 +595,15 @@ Example code for the changed ``urls.py`` file:: url(r'^contact/(?P.+)/$', contact_wizard, name='contact_step'), url(r'^contact/$', contact_wizard, name='contact'), ) + +Advanced ``NamedUrlWizardView`` methods +======================================= + +.. method:: NamedUrlWizardView.get_step_url(step) + + This method returns the URL for a specific step. + + Default implementation:: + + def get_step_url(self, step): + return reverse(self.url_name, kwargs={'step': step})