Skip to content

Commit a10f390

Browse files
committed
Fixed django#19044 -- Made DeletionMixin interpolate its success_url.
Thanks to nxvl and slurms for the initial patch, ptone for the review and timo for the documentation tweaks.
1 parent 5ce6a7c commit a10f390

File tree

5 files changed

+29
-8
lines changed

5 files changed

+29
-8
lines changed

django/views/generic/edit.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,16 +242,17 @@ def delete(self, request, *args, **kwargs):
242242
redirects to the success URL.
243243
"""
244244
self.object = self.get_object()
245+
success_url = self.get_success_url()
245246
self.object.delete()
246-
return HttpResponseRedirect(self.get_success_url())
247+
return HttpResponseRedirect(success_url)
247248

248249
# Add support for browsers which only accept GET and POST for now.
249250
def post(self, *args, **kwargs):
250251
return self.delete(*args, **kwargs)
251252

252253
def get_success_url(self):
253254
if self.success_url:
254-
return self.success_url
255+
return self.success_url % self.object.__dict__
255256
else:
256257
raise ImproperlyConfigured(
257258
"No URL to redirect to. Provide a success_url.")

docs/ref/class-based-views/mixins-editing.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,13 @@ ProcessFormView
201201
The url to redirect to when the nominated object has been
202202
successfully deleted.
203203

204+
.. versionadded:: 1.6
205+
206+
``success_url`` may contain dictionary string formatting, which
207+
will be interpolated against the object's field attributes. For
208+
example, you could use ``success_url="/parent/%(parent_id)s/"`` to
209+
redirect to a URL composed out of the ``parent_id`` field on a model.
210+
204211
.. method:: get_success_url(obj)
205212

206213
Returns the url to redirect to when the nominated object has been

docs/releases/1.6.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ Minor features
6464
:attr:`~django.core.management.BaseCommand.leave_locale_alone` internal
6565
option. See :ref:`management-commands-and-locales` for more details.
6666

67+
* The :attr:`~django.views.generic.edit.DeletionMixin.success_url` of
68+
:class:`~django.views.generic.edit.DeletionMixin` is now interpolated with
69+
its ``object``\'s ``__dict__``.
70+
6771
Backwards incompatible changes in 1.6
6872
=====================================
6973

tests/regressiontests/generic_views/edit.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@
1313

1414

1515
class FormMixinTests(TestCase):
16-
def test_initial_data(self):
17-
""" Test instance independence of initial data dict (see #16138) """
18-
initial_1 = FormMixin().get_initial()
19-
initial_1['foo'] = 'bar'
20-
initial_2 = FormMixin().get_initial()
21-
self.assertNotEqual(initial_1, initial_2)
16+
def test_initial_data(self):
17+
""" Test instance independence of initial data dict (see #16138) """
18+
initial_1 = FormMixin().get_initial()
19+
initial_1['foo'] = 'bar'
20+
initial_2 = FormMixin().get_initial()
21+
self.assertNotEqual(initial_1, initial_2)
2222

2323

2424
class BasicFormTests(TestCase):
@@ -283,6 +283,13 @@ def test_delete_with_redirect(self):
283283
self.assertRedirects(res, 'http://testserver/edit/authors/create/')
284284
self.assertQuerysetEqual(Author.objects.all(), [])
285285

286+
def test_delete_with_interpolated_redirect(self):
287+
a = Author.objects.create(**{'name': 'Randall Munroe', 'slug': 'randall-munroe'})
288+
res = self.client.post('/edit/author/%d/delete/interpolate_redirect/' % a.pk)
289+
self.assertEqual(res.status_code, 302)
290+
self.assertRedirects(res, 'http://testserver/edit/authors/create/?deleted=%d' % a.pk)
291+
self.assertQuerysetEqual(Author.objects.all(), [])
292+
286293
def test_delete_with_special_properties(self):
287294
a = Author.objects.create(**{'name': 'Randall Munroe', 'slug': 'randall-munroe'})
288295
res = self.client.get('/edit/author/%d/delete/special/' % a.pk)

tests/regressiontests/generic_views/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@
9797
views.NaiveAuthorDelete.as_view()),
9898
(r'^edit/author/(?P<pk>\d+)/delete/redirect/$',
9999
views.NaiveAuthorDelete.as_view(success_url='/edit/authors/create/')),
100+
(r'^edit/author/(?P<pk>\d+)/delete/interpolate_redirect/$',
101+
views.NaiveAuthorDelete.as_view(success_url='/edit/authors/create/?deleted=%(id)s')),
100102
(r'^edit/author/(?P<pk>\d+)/delete/$',
101103
views.AuthorDelete.as_view()),
102104
(r'^edit/author/(?P<pk>\d+)/delete/special/$',

0 commit comments

Comments
 (0)