如何解决模块在替换默认管理站点时未定义类错误
我正在学习 Django 管理应用程序的教程,我正在尝试将默认管理站点替换为 django.contrib.admin 中 AdminSite 的自定义子类的步骤。
我的项目结构是:
MyAdminTutorial
|- MyAdminTutorial
|- MyActualApp
|- JustAUserApp
MyActualApp.admin.py:
[...other imports]
from django.contrib.auth.admin import UserAdmin,GroupAdmin
class MyAdminSite(admin.AdminSite):
pass
admin.site = MyAdminSite()
admin.site.register(User,UserAdmin)
admin.site.register(Group,GroupAdmin)
MyActualApp.apps.py:
from django.contrib.admin.apps import AdminConfig
class MyAdminConfig(AdminConfig):
default_site = 'MyActualApp.admin.MyAdminSite'
MyAdminTutorial.settings.py
INSTALLED_APPS = [
"MyActualApp.apps.MyAdminConfig",# 'django.contrib.admin',....
"JustAUserApp",]
如果我尝试运行开发服务器,我会收到此错误:
ImportError: Module "MyActualApp.admin" does not define a "MyAdminSite" attribute/class
在调试器中乱搞,我发现错误源于对 django.utils.module_loading.py 中 import_string() 内的 getattr() 的调用。
对于当前对 import_string() 的调用,模块名称和路径设置为 MyActualApp.admin,在调试控制台中获取当前位置会产生主 MyActualApp 目录(项目的),但调用 getattr(module,"MyAdminSite" ) 触发上述错误。
我希望能找到 MyAdminSite 类,但事实并非如此,这个项目中发生了什么,我不考虑进一步检查什么?
解决方法
事实证明,从 django.contrib.auth.admin 导入 UserAdmin 和 GroupAdmin 的行必须放在我想声明的任何类的声明之后admin.py。使代码看起来像这样:
[...other imports]
class MyAdminSite(admin.AdminSite):
pass
admin.site = MyAdminSite()
from django.contrib.auth.admin import UserAdmin,GroupAdmin
admin.site.register(User,UserAdmin)
admin.site.register(Group,GroupAdmin)
如果像这样修改代码可以工作,但我不会回答这个问题,因为我不知道实际发生了什么。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。