Added further flexibility to ModelAdmin for controlling post-save redirections.
Refs #19505.
This commit is contained in:
parent
f80a1934cd
commit
cee40c7d79
|
@ -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):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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`
|
||||||
|
|
Loading…
Reference in New Issue