Django 1.5 自定义用户模型与 admin.autodiscover() 冲突
我在我的Django 1.5c1项目中有一个自定义用户模型(其实我就叫它User
,因为我觉得没必要起别的名字)。我在设置中正确地定义了AUTH_USER_MODEL
,所以auth
模块可以正常工作,我可以顺利登录等。
但是,启用自定义用户模块后,管理后台就无法使用了。当我在urls.py
中添加admin.autodiscover()
时,网站上的每个页面(不仅仅是管理页面)都会抛出一个NotRegistered
的异常,提示User模型没有注册
。错误追踪显示admin.autodiscover()
在尝试调用admin.site.unregister(User)
,显然是在它注册这个模型之前。
我尝试把我的用户模型改成其他名字,而不是User
,但似乎没有效果。我还尝试为那个应用创建自己的admin.py
,然后手动在admin.py
中注册我的自定义User
模型,并指定自定义的UserAdmin
,在admin.autodiscover()
运行之前,但这实际上导致了另一个异常,提示User
已经注册过了。
接下来我应该尝试什么,才能让admin.autodiscover()
正常工作呢?
2 个回答
看起来,如果你想让自定义的用户模型在后台管理系统中正常工作,你需要做一些额外的设置。从文档中可以了解到:
...你的用户模型需要定义一些额外的属性和方法。这些方法可以让后台管理系统控制用户对管理内容的访问权限:
class models.CustomUser
is_staff
如果用户被允许访问后台网站,这个值为真。
is_active
如果用户账户当前是活跃的,这个值为真。
has_perm(perm, obj=None)
如果用户拥有指定的权限,这个值为真。
has_module_perms(app_label)
如果用户有权限访问指定应用中的模型,这个值为真。
我创建了一个全新的空项目,并设置了一个自定义用户模型,试图重现之前遇到的问题。经过诊断,我们发现是因为在项目中添加了一个叫 django-usertools
的包。这个包没有更新到适配Django 1.5,显然和自定义用户模型发生了冲突。把这个包从设置中的已安装应用列表里删除后,问题就解决了。