diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index b0c2c4dcf9a..8e0aaccc86f 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -1,6 +1,5 @@ import copy from functools import update_wrapper, partial -import warnings from django import forms from django.conf import settings @@ -824,7 +823,7 @@ class ModelAdmin(BaseModelAdmin): else: msg = _('The %(name)s "%(obj)s" was added successfully.') % msg_dict self.message_user(request, msg) - return self.response_post_save(request, obj) + return self.response_post_save_add(request, obj) def response_change(self, request, obj): """ @@ -858,13 +857,27 @@ class ModelAdmin(BaseModelAdmin): else: msg = _('The %(name)s "%(obj)s" was changed successfully.') % msg_dict self.message_user(request, msg) - return self.response_post_save(request, obj) + return self.response_post_save_change(request, obj) - def response_post_save(self, request, obj): + def response_post_save_add(self, request, obj): """ - Figure out where to redirect after the 'Save' button has been pressed. - If the user has change permission, redirect to the change-list page for - this object. Otherwise, redirect to the admin index. + Figure out where to redirect after the 'Save' button has been pressed + when adding a new object. + """ + opts = self.model._meta + if self.has_change_permission(request, None): + post_url = reverse('admin:%s_%s_changelist' % + (opts.app_label, opts.module_name), + current_app=self.admin_site.name) + else: + post_url = reverse('admin:index', + current_app=self.admin_site.name) + return HttpResponseRedirect(post_url) + + def response_post_save_change(self, request, obj): + """ + Figure out where to redirect after the 'Save' button has been pressed + when editing an existing object. """ opts = self.model._meta if self.has_change_permission(request, None): diff --git a/tests/regressiontests/admin_custom_urls/models.py b/tests/regressiontests/admin_custom_urls/models.py index 45b6ed57a9d..ef04c2aa09c 100644 --- a/tests/regressiontests/admin_custom_urls/models.py +++ b/tests/regressiontests/admin_custom_urls/models.py @@ -56,10 +56,14 @@ class Person(models.Model): class PersonAdmin(admin.ModelAdmin): - def response_post_save(self, request, obj): + def response_post_save_add(self, request, obj): return HttpResponseRedirect( reverse('admin:admin_custom_urls_person_history', args=[obj.pk])) + def response_post_save_change(self, request, obj): + return HttpResponseRedirect( + reverse('admin:admin_custom_urls_person_delete', args=[obj.pk])) + class Car(models.Model): name = models.CharField(max_length=20) diff --git a/tests/regressiontests/admin_custom_urls/tests.py b/tests/regressiontests/admin_custom_urls/tests.py index a7edc77c382..31c93410f4c 100644 --- a/tests/regressiontests/admin_custom_urls/tests.py +++ b/tests/regressiontests/admin_custom_urls/tests.py @@ -94,10 +94,11 @@ class CustomRedirects(TestCase): def tearDown(self): self.client.logout() - def test_post_save_redirect(self): + def test_post_save_add_redirect(self): """ - Ensures that ModelAdmin.response_post_save() controls the redirection - after the 'Save' button has been pressed. + Ensures that ModelAdmin.response_post_save_add() controls the + redirection after the 'Save' button has been pressed when adding a + new object. Refs 8001, 18310, 19505. """ post_data = { 'name': 'John Doe', } @@ -109,6 +110,22 @@ class CustomRedirects(TestCase): self.assertRedirects( response, reverse('admin:admin_custom_urls_person_history', args=[persons[0].pk])) + def test_post_save_change_redirect(self): + """ + Ensures that ModelAdmin.response_post_save_change() controls the + redirection after the 'Save' button has been pressed when editing an + existing object. + Refs 8001, 18310, 19505. + """ + Person.objects.create(name='John Doe') + self.assertEqual(Person.objects.count(), 1) + person = Person.objects.all()[0] + post_data = { 'name': 'Jack Doe', } + response = self.client.post( + reverse('admin:admin_custom_urls_person_change', args=[person.pk]), post_data) + self.assertRedirects( + response, reverse('admin:admin_custom_urls_person_delete', args=[person.pk])) + def test_post_url_continue(self): """ Ensures that the ModelAdmin.response_add()'s parameter `post_url_continue`