summaryrefslogtreecommitdiff
path: root/django/contrib/admin/checks.py
diff options
context:
space:
mode:
authorEric Blum <eric@enertiv.com>2025-05-01 16:31:06 -0400
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2025-05-08 11:38:13 +0100
commit384cdf0f7a2c8d1793b120d82a1584776c064f44 (patch)
tree17234cad549df8802cd487f3c4f161ed2c236984 /django/contrib/admin/checks.py
parent358fd21c47cdf7bda520ce73c5cfd82bba57827b (diff)
Fixed #36363 -- Added field names to admin duplicated fields error hint.
Diffstat (limited to 'django/contrib/admin/checks.py')
-rw-r--r--django/contrib/admin/checks.py28
1 files changed, 23 insertions, 5 deletions
diff --git a/django/contrib/admin/checks.py b/django/contrib/admin/checks.py
index a4d7066d10..4bfbe25f22 100644
--- a/django/contrib/admin/checks.py
+++ b/django/contrib/admin/checks.py
@@ -331,11 +331,15 @@ class BaseModelAdminChecks:
id="admin.E005",
)
]
- fields = flatten(obj.fields)
- if len(fields) != len(set(fields)):
+ field_counts = collections.Counter(flatten(obj.fields))
+ if duplicate_fields := [
+ field for field, count in field_counts.items() if count > 1
+ ]:
return [
checks.Error(
"The value of 'fields' contains duplicate field(s).",
+ hint="Remove duplicates of %s."
+ % ", ".join(map(repr, duplicate_fields)),
obj=obj.__class__,
id="admin.E006",
)
@@ -397,11 +401,20 @@ class BaseModelAdminChecks:
id="admin.E008",
)
- seen_fields.extend(flatten(fieldset[1]["fields"]))
- if len(seen_fields) != len(set(seen_fields)):
+ fieldset_fields = flatten(fieldset[1]["fields"])
+ seen_fields.extend(fieldset_fields)
+ field_counts = collections.Counter(seen_fields)
+ fieldset_fields_set = set(fieldset_fields)
+ if duplicate_fields := [
+ field
+ for field, count in field_counts.items()
+ if count > 1 and field in fieldset_fields_set
+ ]:
return [
checks.Error(
"There are duplicate field(s) in '%s[1]'." % label,
+ hint="Remove duplicates of %s."
+ % ", ".join(map(repr, duplicate_fields)),
obj=obj.__class__,
id="admin.E012",
)
@@ -469,10 +482,15 @@ class BaseModelAdminChecks:
return must_be(
"a list or tuple", option="exclude", obj=obj, id="admin.E014"
)
- elif len(obj.exclude) > len(set(obj.exclude)):
+ field_counts = collections.Counter(obj.exclude)
+ if duplicate_fields := [
+ field for field, count in field_counts.items() if count > 1
+ ]:
return [
checks.Error(
"The value of 'exclude' contains duplicate field(s).",
+ hint="Remove duplicates of %s."
+ % ", ".join(map(repr, duplicate_fields)),
obj=obj.__class__,
id="admin.E015",
)