Opened 6 years ago
Closed 6 years ago
#29992 closed Bug (needsinfo)
Error in admin checking list_display items
Reported by: | Giovanni Toffoli | Owned by: | nobody |
---|---|---|---|
Component: | contrib.admin | Version: | 2.1 |
Severity: | Release blocker | Keywords: | |
Cc: | toffoli@… | Triage Stage: | Unreviewed |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
I'm porting my app from Django 1.8 and 2.0.6 to Django 2.1.3.
In the last environment, runserver emits a lot of system check issues of type admin.E108
They refer to fields from different modules and many different classes, but all of them are CharField or TextField.
I see that method _check_list_display_item of class ModelAdminChecks in module check of django.contrib.admin has changed significantly between releases 2.0.6 and 2.1.3; in the latter, has been removed the last branch (else) of the top-level if-elif-else structure, although it was explicitly stated, in a comment inside it, that the associated path was required.
I'm not able to make a complete diagnosis, but it seems that testing
hasattr(model, item)
in general gives a different result than testing the existence of the same field with
model._meta.get_field(item)
In fact, using the manage.py shell command, I experimentally verified such difference on a subset of the fields presenting the above mentioned problem: the hasattr test yields sometimes True and sometimes False (don't know why), while the other way of testing the existence of the field always yields a True result.
Change History (6)
comment:1 by , 6 years ago
comment:3 by , 6 years ago
In my view #29636 correctly identifies the commit at the origin of the problem, but doesn't explain the cause.
My case is very similar but it involves only CharField and TextField, not a field class I defined, nor, for example, IntegerField.
And, as far as I can understand, these field classes haven't the get method at all.
An excerpt of my code follows
@python_2_unicode_compatible class Repo(models.Model): name = models.CharField(max_length=255, db_index=True, verbose_name=_('name')) description = models.TextField(blank=True, null=True, verbose_name=_('short description')) state = models.IntegerField(choices=PUBLICATION_STATE_CHOICES, default=DRAFT, null=True, verbose_name='publication state') ...
class RepoAdmin(admin.ModelAdmin): list_display = ('id', 'name', 'slug', 'description', 'repo_type', 'state', 'user_fullname', 'created', 'modified',) ...
and this is an excerpt of the error log:
<class 'commons.admin.RepoAdmin'>: (admin.E108) The value of 'list_display[1]' refers to 'name', which is not a callable, an attribute of 'RepoAdmin', or an attribute or method on 'commons.Repo'. <class 'commons.admin.RepoAdmin'>: (admin.E108) The value of 'list_display[3]' refers to 'description', which is not a callable, an attribute of 'RepoAdmin', or an attribute or method on 'commons.Repo'.
comment:4 by , 6 years ago
I don't get a check error with the excerpt you provided. Please provide a minimal project that demonstrates the issue.
comment:5 by , 6 years ago
You are right. I created a new project for testing, starting with that excerpt; then added some more stuff, without being able to reproduce the problem.
I don't know what, in the real project, interferes with the creation of admin classes. When I can, I'll keep adding stuff to the test project.
For the moment I will use a patched version of the admin.check module.
comment:6 by , 6 years ago
Resolution: | → needsinfo |
---|---|
Status: | new → closed |
Please give a minimal sample project that reproduces the issue.