Added further flexibility to ModelAdmin for controlling post-save redirections.

Refs #19505.
This commit is contained in:
Julien Phalip 2012-12-30 21:33:21 -08:00
parent f80a1934cd
commit cee40c7d79
3 changed files with 45 additions and 11 deletions

View File

@ -1,6 +1,5 @@
import copy import copy
from functools import update_wrapper, partial from functools import update_wrapper, partial
import warnings
from django import forms from django import forms
from django.conf import settings from django.conf import settings
@ -824,7 +823,7 @@ class ModelAdmin(BaseModelAdmin):
else: else:
msg = _('The %(name)s "%(obj)s" was added successfully.') % msg_dict msg = _('The %(name)s "%(obj)s" was added successfully.') % msg_dict
self.message_user(request, msg) 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): def response_change(self, request, obj):
""" """
@ -858,13 +857,27 @@ class ModelAdmin(BaseModelAdmin):
else: else:
msg = _('The %(name)s "%(obj)s" was changed successfully.') % msg_dict msg = _('The %(name)s "%(obj)s" was changed successfully.') % msg_dict
self.message_user(request, msg) 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. 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 when adding a new object.
this object. Otherwise, redirect to the admin index. """
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 opts = self.model._meta
if self.has_change_permission(request, None): if self.has_change_permission(request, None):

View File

@ -56,10 +56,14 @@ class Person(models.Model):
class PersonAdmin(admin.ModelAdmin): class PersonAdmin(admin.ModelAdmin):
def response_post_save(self, request, obj): def response_post_save_add(self, request, obj):
return HttpResponseRedirect( return HttpResponseRedirect(
reverse('admin:admin_custom_urls_person_history', args=[obj.pk])) 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): class Car(models.Model):
name = models.CharField(max_length=20) name = models.CharField(max_length=20)

View File

@ -94,10 +94,11 @@ class CustomRedirects(TestCase):
def tearDown(self): def tearDown(self):
self.client.logout() 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 Ensures that ModelAdmin.response_post_save_add() controls the
after the 'Save' button has been pressed. redirection after the 'Save' button has been pressed when adding a
new object.
Refs 8001, 18310, 19505. Refs 8001, 18310, 19505.
""" """
post_data = { 'name': 'John Doe', } post_data = { 'name': 'John Doe', }
@ -109,6 +110,22 @@ class CustomRedirects(TestCase):
self.assertRedirects( self.assertRedirects(
response, reverse('admin:admin_custom_urls_person_history', args=[persons[0].pk])) 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): def test_post_url_continue(self):
""" """
Ensures that the ModelAdmin.response_add()'s parameter `post_url_continue` Ensures that the ModelAdmin.response_add()'s parameter `post_url_continue`