Commit cee40c7d authored by Julien Phalip's avatar Julien Phalip
Browse files

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

Refs #19505.
parent f80a1934
Loading
Loading
Loading
Loading
+20 −7
Original line number Diff line number Diff line
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):
+5 −1
Original line number Diff line number Diff line
@@ -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)
+20 −3
Original line number Diff line number Diff line
@@ -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`