From dc9deea8e85641695e489e43ed5d5638134c15c7 Mon Sep 17 00:00:00 2001 From: Jacob Walls Date: Sat, 1 Jan 2022 11:56:10 -0500 Subject: [PATCH] Fixed #11715 -- Changed default value of ModelAdmin.actions/inlines to empty tuples. This clarifies the intended pattern of overwriting the default value rather than mutating it. --- django/contrib/admin/options.py | 4 ++-- docs/releases/4.1.txt | 4 ++++ tests/modeladmin/tests.py | 5 +++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 100e481229c..12cd0948cac 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -565,7 +565,7 @@ class ModelAdmin(BaseModelAdmin): save_on_top = False paginator = Paginator preserve_filters = True - inlines = [] + inlines = () # Custom templates (designed to be over-ridden in subclasses) add_form_template = None @@ -577,7 +577,7 @@ class ModelAdmin(BaseModelAdmin): popup_response_template = None # Actions - actions = [] + actions = () action_form = helpers.ActionForm actions_on_top = True actions_on_bottom = False diff --git a/docs/releases/4.1.txt b/docs/releases/4.1.txt index fa1c05bc80f..e3bc02f2264 100644 --- a/docs/releases/4.1.txt +++ b/docs/releases/4.1.txt @@ -341,6 +341,10 @@ Miscellaneous ``request.META['CSRF_COOKIE']`` for storing the unmasked CSRF secret rather than a masked version. This is an undocumented, private API. +* The :attr:`.ModelAdmin.actions` and + :attr:`~django.contrib.admin.ModelAdmin.inlines` attributes now default to an + empty tuple rather than an empty list to discourage unintended mutation. + .. _deprecated-features-4.1: Features deprecated in 4.1 diff --git a/tests/modeladmin/tests.py b/tests/modeladmin/tests.py index 42cc369a9e4..64326797350 100644 --- a/tests/modeladmin/tests.py +++ b/tests/modeladmin/tests.py @@ -50,6 +50,11 @@ class ModelAdminTests(TestCase): ma = ModelAdmin(Band, self.site) self.assertEqual(str(ma), 'modeladmin.ModelAdmin') + def test_default_attributes(self): + ma = ModelAdmin(Band, self.site) + self.assertEqual(ma.actions, ()) + self.assertEqual(ma.inlines, ()) + # form/fields/fieldsets interaction ############################## def test_default_fields(self):