Django 1.5 自定义用户模型与 admin.autodiscover() 冲突

1 投票
2 回答
1401 浏览
提问于 2025-04-17 16:19

我在我的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 个回答

2

看起来,如果你想让自定义的用户模型在后台管理系统中正常工作,你需要做一些额外的设置。从文档中可以了解到:

...你的用户模型需要定义一些额外的属性和方法。这些方法可以让后台管理系统控制用户对管理内容的访问权限:

class models.CustomUser

is_staff 如果用户被允许访问后台网站,这个值为真。

is_active 如果用户账户当前是活跃的,这个值为真。

has_perm(perm, obj=None) 如果用户拥有指定的权限,这个值为真。

has_module_perms(app_label) 如果用户有权限访问指定应用中的模型,这个值为真。

1

我创建了一个全新的空项目,并设置了一个自定义用户模型,试图重现之前遇到的问题。经过诊断,我们发现是因为在项目中添加了一个叫 django-usertools 的包。这个包没有更新到适配Django 1.5,显然和自定义用户模型发生了冲突。把这个包从设置中的已安装应用列表里删除后,问题就解决了。

撰写回答