Django admin报错:list_display中'x'不可调用的问题排查
看你给出的代码和报错信息,ModelA明明定义了x、y、z字段,但Admin却识别不到,我之前也碰到过类似的情况,大概率是以下几个原因之一,咱们一步步排查:
第一步:检查模型导入是否正确
先确认admin.py里ModelA的导入路径和拼写完全没问题。比如要确保是:from .models import ModelA # 从当前app的models模块导入正确的模型类别不小心导入了别的重名模型,或者把
ModelA写成了小写的modelA——报错信息里提到的小写modelA可能就是个提示,说不定你导入时拼写出错了。第二步:确认数据库迁移已执行
如果是刚创建的ModelA,或者刚添加的x/y/z字段,一定要记得执行迁移命令:python manage.py makemigrations python manage.py migrateDjango的Admin依赖数据库的元数据,如果迁移没跑,Admin可能还不知道这些字段存在。
第三步:重启开发服务器并清除缓存
开发环境下Django有时候会缓存模型的元数据,哪怕修改了模型也不会立刻识别。试试关掉当前的runserver进程,重新启动;如果项目用了缓存后端(比如Redis),也可以清空一下缓存。第四步:用自定义方法验证字段访问
虽然x/y/z都是普通名字,但可以试试用自定义方法返回字段值,验证Admin是否能正常访问模型实例:@admin.register(ModelA) class ModelAAdmin(admin.ModelAdmin): list_display = ['show_x', 'y', 'z'] def show_x(self, obj): return obj.x show_x.short_description = 'X' # 给列表列设置显示名称如果这样能正常显示,说明是Django对字段元数据的识别出了问题,回到第二步重新检查迁移,甚至可以删除migrations目录下除
__init__.py之外的文件,重新生成迁移试试。第五步:确认app已加入INSTALLED_APPS
最后检查一下你的app是否在settings.py的INSTALLED_APPS列表里注册了,如果app没加进去,Django根本不会加载这个app的模型,Admin自然找不到对应的字段。
内容的提问来源于stack exchange,提问作者Bayko

