diff options
| author | Eric Blum <eric@enertiv.com> | 2025-05-01 16:31:06 -0400 |
|---|---|---|
| committer | Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> | 2025-05-08 11:38:13 +0100 |
| commit | 384cdf0f7a2c8d1793b120d82a1584776c064f44 (patch) | |
| tree | 17234cad549df8802cd487f3c4f161ed2c236984 /django/contrib/admin/checks.py | |
| parent | 358fd21c47cdf7bda520ce73c5cfd82bba57827b (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.py | 28 |
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", ) |
