Fixed #14803 -- Corrected an inconsistency in redirection handling between 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
This commit is contained in:
parent
ac91d5ef08
commit
324658ef26
|
@ -97,7 +97,7 @@ class ModelFormMixin(FormMixin, SingleObjectMixin):
|
||||||
|
|
||||||
def get_success_url(self):
|
def get_success_url(self):
|
||||||
if self.success_url:
|
if self.success_url:
|
||||||
url = self.success_url
|
url = self.success_url % self.object.__dict__
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
url = self.object.get_absolute_url()
|
url = self.object.get_absolute_url()
|
||||||
|
|
|
@ -481,6 +481,11 @@ ModelFormMixin
|
||||||
|
|
||||||
The URL to redirect to when the form is successfully processed.
|
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()
|
.. method:: get_form_class()
|
||||||
|
|
||||||
Retrieve the form class to instantiate. If
|
Retrieve the form class to instantiate. If
|
||||||
|
|
|
@ -113,6 +113,13 @@ For example::
|
||||||
})
|
})
|
||||||
return context
|
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``
|
``mimetype``
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,14 @@ class CreateViewTests(TestCase):
|
||||||
self.assertRedirects(res, 'http://testserver/edit/authors/create/')
|
self.assertRedirects(res, 'http://testserver/edit/authors/create/')
|
||||||
self.assertQuerysetEqual(Author.objects.all(), ['<Author: Randall Munroe>'])
|
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):
|
def test_create_with_special_properties(self):
|
||||||
res = self.client.get('/edit/authors/create/special/')
|
res = self.client.get('/edit/authors/create/special/')
|
||||||
self.assertEqual(res.status_code, 200)
|
self.assertEqual(res.status_code, 200)
|
||||||
|
@ -145,6 +153,18 @@ class UpdateViewTests(TestCase):
|
||||||
self.assertRedirects(res, 'http://testserver/edit/authors/create/')
|
self.assertRedirects(res, 'http://testserver/edit/authors/create/')
|
||||||
self.assertQuerysetEqual(Author.objects.all(), ['<Author: Randall Munroe (author of xkcd)>'])
|
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):
|
def test_update_with_special_properties(self):
|
||||||
a = Author.objects.create(
|
a = Author.objects.create(
|
||||||
name='Randall Munroe',
|
name='Randall Munroe',
|
||||||
|
|
|
@ -51,6 +51,8 @@ urlpatterns = patterns('',
|
||||||
views.NaiveAuthorCreate.as_view()),
|
views.NaiveAuthorCreate.as_view()),
|
||||||
(r'^edit/authors/create/redirect/$',
|
(r'^edit/authors/create/redirect/$',
|
||||||
views.NaiveAuthorCreate.as_view(success_url='/edit/authors/create/')),
|
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/$',
|
(r'^edit/authors/create/restricted/$',
|
||||||
views.AuthorCreateRestricted.as_view()),
|
views.AuthorCreateRestricted.as_view()),
|
||||||
(r'^edit/authors/create/$',
|
(r'^edit/authors/create/$',
|
||||||
|
@ -62,6 +64,8 @@ urlpatterns = patterns('',
|
||||||
views.NaiveAuthorUpdate.as_view()),
|
views.NaiveAuthorUpdate.as_view()),
|
||||||
(r'^edit/author/(?P<pk>\d+)/update/redirect/$',
|
(r'^edit/author/(?P<pk>\d+)/update/redirect/$',
|
||||||
views.NaiveAuthorUpdate.as_view(success_url='/edit/authors/create/')),
|
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/$',
|
(r'^edit/author/(?P<pk>\d+)/update/$',
|
||||||
views.AuthorUpdate.as_view()),
|
views.AuthorUpdate.as_view()),
|
||||||
(r'^edit/author/(?P<pk>\d+)/update/special/$',
|
(r'^edit/author/(?P<pk>\d+)/update/special/$',
|
||||||
|
@ -185,4 +189,4 @@ urlpatterns = patterns('',
|
||||||
|
|
||||||
# Useful for testing redirects
|
# Useful for testing redirects
|
||||||
(r'^accounts/login/$', 'django.contrib.auth.views.login')
|
(r'^accounts/login/$', 'django.contrib.auth.views.login')
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue