summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Phalip <jphalip@gmail.com>2012-12-30 21:33:21 -0800
committerJulien Phalip <jphalip@gmail.com>2012-12-30 21:33:21 -0800
commitcee40c7d79930ff42bde4730f43e68a624e47b0f (patch)
tree3e25c340c81f26eeb5f1ace204382d00c1824480
parentf80a1934cdb465c70ecc215fdf867e555a670623 (diff)
Added further flexibility to ModelAdmin for controlling post-save redirections.
Refs #19505.
-rw-r--r--django/contrib/admin/options.py27
-rw-r--r--tests/regressiontests/admin_custom_urls/models.py6
-rw-r--r--tests/regressiontests/admin_custom_urls/tests.py23
3 files changed, 45 insertions, 11 deletions
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index b0c2c4dcf9..8e0aaccc86 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 45b6ed57a9..ef04c2aa09 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 a7edc77c38..31c93410f4 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`