Skip to content

Commit

Permalink
Fixed #17163 -- Added the NamedUrlWizardView.get_step_url() method.…
Browse files Browse the repository at this point in the history
… Thanks, Bradley Ayers.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17235 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
jphalip committed Dec 19, 2011
1 parent 1ef6841 commit 355f7fc
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 11 deletions.
19 changes: 10 additions & 9 deletions django/contrib/formtools/wizard/views.py
Expand Up @@ -591,6 +591,9 @@ def get_initkwargs(cls, *args, **kwargs):
'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.
Expand All @@ -604,10 +607,8 @@ def get(self, *args, **kwargs):
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:
Expand Down Expand Up @@ -636,7 +637,7 @@ def get(self, *args, **kwargs):
# 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):
"""
Expand All @@ -646,7 +647,7 @@ def post(self, *args, **kwargs):
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):
Expand All @@ -665,23 +666,23 @@ def render_next_step(self, form, **kwargs):
"""
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):
"""
When a step fails, we have to redirect the user to the first failing
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):
"""
When rendering the done view, we have to redirect first (if the URL
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)


Expand Down
16 changes: 14 additions & 2 deletions docs/ref/contrib/formtools/form-wizard.txt
Expand Up @@ -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

Expand Down Expand Up @@ -595,3 +595,15 @@ Example code for the changed ``urls.py`` file::
url(r'^contact/(?P<step>.+)/$', 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})

0 comments on commit 355f7fc

Please sign in to comment.