1
0
mirror of https://github.com/django/django.git synced 2025-06-05 03:29:12 +00:00

[1.5.x] Added further flexibility to ModelAdmin for controlling post-save redirections.

Refs #19505.
Backport of cee40c7d79930ff42bde4
This commit is contained in:
Julien Phalip 2012-12-30 21:33:21 -08:00
parent e871e02178
commit fa71536129
3 changed files with 47 additions and 12 deletions

View File

@ -838,7 +838,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):
""" """
@ -872,13 +872,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)
@ -85,4 +89,4 @@ class CarDeprecatedAdmin(admin.ModelAdmin):
admin.site.register(Action, ActionAdmin) admin.site.register(Action, ActionAdmin)
admin.site.register(Person, PersonAdmin) admin.site.register(Person, PersonAdmin)
admin.site.register(Car, CarAdmin) admin.site.register(Car, CarAdmin)
admin.site.register(CarDeprecated, CarDeprecatedAdmin) admin.site.register(CarDeprecated, CarDeprecatedAdmin)

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`
@ -139,4 +156,4 @@ class CustomRedirects(TestCase):
self.assertRedirects( self.assertRedirects(
response, reverse('admin:admin_custom_urls_cardeprecated_history', args=[cars[0].pk])) response, reverse('admin:admin_custom_urls_cardeprecated_history', args=[cars[0].pk]))
self.assertEqual(len(w), 1) self.assertEqual(len(w), 1)
self.assertTrue(isinstance(w[0].message, DeprecationWarning)) self.assertTrue(isinstance(w[0].message, DeprecationWarning))