Opened 8 months ago

Closed 8 months 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 Changed 8 months ago by Tim Graham

Please give a minimal sample project that reproduces the issue.

comment:2 Changed 8 months ago by Tim Graham

Check if #29636 explains the cause.

comment:3 Changed 8 months ago by Giovanni Toffoli

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 Changed 8 months ago by Tim Graham

I don't get a check error with the excerpt you provided. Please provide a minimal project that demonstrates the issue.

comment:5 Changed 8 months ago by Giovanni Toffoli

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.

Version 0, edited 8 months ago by Giovanni Toffoli (next)

comment:6 Changed 8 months ago by Tim Graham

Resolution: needsinfo
Status: newclosed
Note: See TracTickets for help on using tickets.
Back to Top