Index: docs/ref/contrib/formtools/form-wizard.txt
===================================================================
--- docs/ref/contrib/formtools/form-wizard.txt	(revision 17068)
+++ docs/ref/contrib/formtools/form-wizard.txt	(working copy)
@@ -559,8 +559,8 @@
 ``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
 
@@ -597,3 +597,15 @@
         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})
Index: django/contrib/formtools/wizard/views.py
===================================================================
--- django/contrib/formtools/wizard/views.py	(revision 17068)
+++ django/contrib/formtools/wizard/views.py	(working copy)
@@ -586,6 +586,9 @@
             '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.
@@ -599,10 +602,8 @@
                 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:
@@ -631,7 +632,7 @@
         # 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):
         """
@@ -641,7 +642,7 @@
         prev_step = self.request.POST.get('wizard_prev_step', None)
         if prev_step and prev_step in self.get_form_list():
             self.storage.current_step = prev_step
-            return redirect(self.url_name, step=prev_step)
+            return redirect(self.get_step_url(prev_step))
         return super(NamedUrlWizardView, self).post(*args, **kwargs)
 
     def render_next_step(self, form, **kwargs):
@@ -651,7 +652,7 @@
         """
         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):
         """
@@ -659,7 +660,7 @@
         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):
         """
@@ -667,7 +668,7 @@
         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)
 
 
@@ -683,4 +684,3 @@
     A NamedUrlFormWizard with pre-configured CookieStorageBackend.
     """
     storage_name = 'django.contrib.formtools.wizard.storage.cookie.CookieStorage'
-
