Skip to content

Commit

Permalink
Fixed #14803 -- Corrected an inconsistency in redirection handling be…
Browse files Browse the repository at this point in the history
…tween old-style generic views and class-based views. Thanks to gg for the report and patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14808 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
freakboy3742 committed Dec 4, 2010
1 parent ac91d5e commit 324658e
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 2 deletions.
2 changes: 1 addition & 1 deletion django/views/generic/edit.py
Expand Up @@ -97,7 +97,7 @@ def get_form(self, form_class):

def get_success_url(self):
if self.success_url:
url = self.success_url
url = self.success_url % self.object.__dict__
else:
try:
url = self.object.get_absolute_url()
Expand Down
5 changes: 5 additions & 0 deletions docs/ref/class-based-views.txt
Expand Up @@ -481,6 +481,11 @@ ModelFormMixin

The URL to redirect to when the form is successfully processed.

``success_url`` may contain dictionary string formatting, which
will be interpolated against the object's field attributes. For
example, you could use ``success_url="/polls/%(slug)s/"`` to
redirect to a URL composed out of the ``slug`` field on a model.

.. method:: get_form_class()

Retrieve the form class to instantiate. If
Expand Down
7 changes: 7 additions & 0 deletions docs/topics/generic-views-migration.txt
Expand Up @@ -113,6 +113,13 @@ For example::
})
return context

``post_save_redirect`` argument to create and update views
----------------------------------------------------------

The ``post_save_redirect`` argument to the create and update views
has been renamed ``success_url`` on the
:class:`~django.views.generic.edit.ModelFormMixin`.

``mimetype``
------------

Expand Down
20 changes: 20 additions & 0 deletions tests/regressiontests/generic_views/edit.py
Expand Up @@ -47,6 +47,14 @@ def test_create_with_redirect(self):
self.assertRedirects(res, 'http://testserver/edit/authors/create/')
self.assertQuerysetEqual(Author.objects.all(), ['<Author: Randall Munroe>'])

def test_create_with_interpolated_redirect(self):
res = self.client.post('/edit/authors/create/interpolate_redirect/',
{'name': 'Randall Munroe', 'slug': 'randall-munroe'})
self.assertQuerysetEqual(Author.objects.all(), ['<Author: Randall Munroe>'])
self.assertEqual(res.status_code, 302)
pk = Author.objects.all()[0].pk
self.assertRedirects(res, 'http://testserver/edit/author/%d/update/' % pk)

def test_create_with_special_properties(self):
res = self.client.get('/edit/authors/create/special/')
self.assertEqual(res.status_code, 200)
Expand Down Expand Up @@ -145,6 +153,18 @@ def test_update_with_redirect(self):
self.assertRedirects(res, 'http://testserver/edit/authors/create/')
self.assertQuerysetEqual(Author.objects.all(), ['<Author: Randall Munroe (author of xkcd)>'])

def test_update_with_interpolated_redirect(self):
a = Author.objects.create(
name='Randall Munroe',
slug='randall-munroe',
)
res = self.client.post('/edit/author/%d/update/interpolate_redirect/' % a.pk,
{'name': 'Randall Munroe (author of xkcd)', 'slug': 'randall-munroe'})
self.assertQuerysetEqual(Author.objects.all(), ['<Author: Randall Munroe (author of xkcd)>'])
self.assertEqual(res.status_code, 302)
pk = Author.objects.all()[0].pk
self.assertRedirects(res, 'http://testserver/edit/author/%d/update/' % pk)

def test_update_with_special_properties(self):
a = Author.objects.create(
name='Randall Munroe',
Expand Down
6 changes: 5 additions & 1 deletion tests/regressiontests/generic_views/urls.py
Expand Up @@ -51,6 +51,8 @@
views.NaiveAuthorCreate.as_view()),
(r'^edit/authors/create/redirect/$',
views.NaiveAuthorCreate.as_view(success_url='/edit/authors/create/')),
(r'^edit/authors/create/interpolate_redirect/$',
views.NaiveAuthorCreate.as_view(success_url='/edit/author/%(id)d/update/')),
(r'^edit/authors/create/restricted/$',
views.AuthorCreateRestricted.as_view()),
(r'^edit/authors/create/$',
Expand All @@ -62,6 +64,8 @@
views.NaiveAuthorUpdate.as_view()),
(r'^edit/author/(?P<pk>\d+)/update/redirect/$',
views.NaiveAuthorUpdate.as_view(success_url='/edit/authors/create/')),
(r'^edit/author/(?P<pk>\d+)/update/interpolate_redirect/$',
views.NaiveAuthorUpdate.as_view(success_url='/edit/author/%(id)d/update/')),
(r'^edit/author/(?P<pk>\d+)/update/$',
views.AuthorUpdate.as_view()),
(r'^edit/author/(?P<pk>\d+)/update/special/$',
Expand Down Expand Up @@ -185,4 +189,4 @@

# Useful for testing redirects
(r'^accounts/login/$', 'django.contrib.auth.views.login')
)
)

0 comments on commit 324658e

Please sign in to comment.