Django+django-tagging环境下Tagged Items管理页报AttributeError求助
我之前在类似的环境配置里碰到过一模一样的问题,大概率是旧版django-tagging和Django 1.11的兼容性冲突,再加上Grappelli管理界面的渲染逻辑影响导致的。下面是几个亲测有效的解决思路:
1. 过滤无效TaggedItem记录的自定义Admin类
默认的TaggedItemAdmin没有处理关联对象已被删除的情况,导致页面加载时找不到对应模型的_base_manager。你可以自定义Admin类来覆盖默认逻辑:
from django.contrib import admin from tagging.models import TaggedItem from tagging.admin import TaggedItemAdmin class CustomTaggedItemAdmin(TaggedItemAdmin): def get_queryset(self, request): qs = super(CustomTaggedItemAdmin, self).get_queryset(request) # 只保留有有效关联对象的记录 return qs.filter(object_id__isnull=False) # 先注销默认的Admin,再注册自定义版本 admin.site.unregister(TaggedItem) admin.site.register(TaggedItem, CustomTaggedItemAdmin)
把这段代码放到你项目的admin.py里,刷新管理页面应该就能看到效果。
2. 清理数据库中的无效TaggedItem数据
如果数据库里存在关联模型已被删除的TaggedItem记录,也会触发这个错误。可以通过Django Shell手动清理:
from tagging.models import TaggedItem # 遍历所有TaggedItem,检查关联对象是否存在 for item in TaggedItem.objects.all(): try: # 尝试获取关联对象,不存在会抛出异常 item.content_object except: # 删除无效记录 item.delete()
执行完这段代码后,再回到管理后台刷新页面看看。
3. 升级django-tagging到兼容版本
django-tagging 0.4.6是比较老旧的版本,对Django 1.11的支持不够完善。如果项目允许的话,可以尝试升级到django-tagging==0.5.0(这个版本官方标注支持Django 1.8-1.11),升级前记得备份数据库和代码,避免引入其他兼容性问题。
4. 排查Grappelli模板的兼容性问题
如果上面的方法都没用,可以临时禁用Grappelli(注释掉settings里的Grappelli相关配置),看看Tagged Items页面是否正常。如果正常,说明是Grappelli的Admin模板和TaggedItemAdmin的渲染逻辑冲突了。你可以在项目的templates/admin目录下创建tagging/taggeditem/change_list.html,复制默认Django的change_list模板内容,替换掉Grappelli的特殊渲染部分,来适配TaggedItem的展示。
内容的提问来源于stack exchange,提问作者jayuu

