summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--django/contrib/contenttypes/admin.py12
-rw-r--r--tests/generic_inline_admin/tests.py11
3 files changed, 18 insertions, 6 deletions
diff --git a/AUTHORS b/AUTHORS
index 510469182a..c85a9a23e3 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -668,6 +668,7 @@ answer newbie questions, and generally made Django that much better:
Mads Jensen <https://github.com/atombrella>
Makoto Tsuyuki <mtsuyuki@gmail.com>
Malcolm Tredinnick
+ Manas Madeshiya <manas112madeshiya@gmail.com>
Manav Agarwal <dpsman13016@gmail.com>
Manuel Saelices <msaelices@yaco.es>
Manuzhai
diff --git a/django/contrib/contenttypes/admin.py b/django/contrib/contenttypes/admin.py
index d324a4f4fe..c55325ecbe 100644
--- a/django/contrib/contenttypes/admin.py
+++ b/django/contrib/contenttypes/admin.py
@@ -100,12 +100,12 @@ class GenericInlineModelAdmin(InlineModelAdmin):
fields = kwargs.pop("fields")
else:
fields = flatten_fieldsets(self.get_fieldsets(request, obj))
- exclude = [*(self.exclude or []), *self.get_readonly_fields(request, obj)]
- if (
- self.exclude is None
- and hasattr(self.form, "_meta")
- and self.form._meta.exclude
- ):
+ excluded = self.get_exclude(request, obj)
+ exclude = [
+ *(excluded or []),
+ *self.get_readonly_fields(request, obj),
+ ]
+ if excluded is None and hasattr(self.form, "_meta") and self.form._meta.exclude:
# Take the custom ModelForm's Meta.exclude into account only if the
# GenericInlineModelAdmin doesn't define its own.
exclude.extend(self.form._meta.exclude)
diff --git a/tests/generic_inline_admin/tests.py b/tests/generic_inline_admin/tests.py
index b4833e54e7..01346f500e 100644
--- a/tests/generic_inline_admin/tests.py
+++ b/tests/generic_inline_admin/tests.py
@@ -577,3 +577,14 @@ class GenericInlineModelAdminTest(SimpleTestCase):
request.name = name
self.assertEqual(ma.get_inlines(request, None), (inline_class,))
self.assertEqual(type(ma.get_inline_instances(request)[0]), inline_class)
+
+ def test_get_exclude_is_respected(self):
+ class GetExcludeInline(GenericTabularInline):
+ model = Media
+
+ def get_exclude(self, request, obj=None):
+ return ["url"]
+
+ ma = GetExcludeInline(Media, self.site)
+ formset = ma.get_formset(request)
+ self.assertNotIn("url", formset.form.base_fields)