django 1.5 扩展默认用户模型或替换它

Posted

技术标签:

【中文标题】django 1.5 扩展默认用户模型或替换它【英文标题】:django 1.5 extend the default User model or substitute it 【发布时间】:2013-05-12 09:50:18 【问题描述】:

环境:Django 1.5.1 + Django CMS 2.4.1 + Zinnia latest + 我的自定义应用程序 + 自定义 Django CMS 插件

基本上我可以扩展默认的 Django (1.5.X) 用户模型 喜欢Django Ribbit Tutorial on NetTuts+

替换完全自定义的模型,如Django Dev doc 或段落中的 Django2Scoops 示例:“处理用户模型”

为了测试我决定使用子类 AbstractUser 来自 Django2Scoops 书:“如果您喜欢 Django 的用户模型字段,请选择此选项,但需要额外的 ..fields。”

但我有以下错误:

notification.noticesetting: 'user' 定义与模型的关系 'auth.User',已被换掉。更新与点的关系 在 settings.AUTH_USER_MODEL。 cmsplugin_zinnia.latestentries 插件: “authors”定义了与模型“auth.User”的关系,该模型具有 被换掉了。更新指向的关系 settings.AUTH_USER_MODEL。

cms.pageuser: 'created_by' 定义了与模型的关系 'auth.User',已被换掉。更新与点的关系 在 settings.AUTH_USER_MODEL。 cms.pageusergroup: 'created_by' 定义了一个 与已换出的模型“auth.User”的关系。 更新指向 settings.AUTH_USER_MODEL 的关系。

经过数小时的阅读和测试,我发现

Specifying custom User model (extends AbstractUser) doesn't work

正如错误消息所说——你需要更新关系到点 在 settings.AUTH_USER_MODEL。第二个错误(“模型已被交换 out...") 是您直接引用的事实的副作用 用户模型。一旦您更改了 ForieignKey 引用,这第三个 错误会消失。我们已尽一切努力确保顺利 过渡到新的用户模型,但不能完全 透明。应用程序编写者需要将他们的应用程序更新为 1.5 兼容的。本质上,Django 1.4 应用程序不会 100% 兼容 如果 Django 1.5 包含硬编码的外键引用 用户。请问,你能给我更多的例子吗?

还有Django/Python: Update the relation to point at settings.AUTH_USER_MODEL

在 settings_example.py 你有 AUTH_USER_MODEL = 'users.User'。 但是,您使用的应用程序 - menu.bookmark - 与 django.contrib.auth.User - 你不能同时拥有。环境 AUTH_USER_MODEL 表示您正在替换内置的 Django 用户 用你自己的模型。看 http://procrastinatingdev.com/django/using-configurable-user-models-in-django-1-5/ 了解详情。

但我不明白我该如何解决这个问题。

我需要什么:

-用户链接到学院类(一个学院 -> 更多用户)

-用户或机构可以有不同的权限,看到不同的django cms 页面/插件。

-用户的多个字段。

子类 AbstractUser 是否正确?

如何解决“换出”错误?

我应该创建类似于OpenTreeMap Code的东西

这段代码没有被弃用吗?

谢谢!

【问题讨论】:

github.com/divio/django-cms/issues/1798 django CMS 目前不支持 AUTH_USER_MODEL。因此,我该怎么办? 【参考方案1】:

有一个非常简单的解决方案。只需在导入 CMSPlugin 之前注册您的自定义用户。示例:

from django.db import models
from django.contrib.auth import models as auth_models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
  telephone = models.CharField(max_length=100)
  email = models.CharField(max_length=100)

auth_models.User = User

from cms.models import CMSPlugin

【讨论】:

【参考方案2】:

这是我对https://github.com/divio/django-cms/issues/1798进一步讨论的总结。

有四种可能的选择:

    如果您需要自定义用户模型的名称不是 User,则需要等待。 您可以调用自定义用户模型User - 虽然当我尝试此操作时,我收到有关与相关 m2m 字段冲突的错误。上述链接中有一些详细信息可能有助于解决此问题。 Django 1.5 仍然允许您使用用户配置文件。因此,如果您可以使用已弃用的功能,您仍然可以将 Django-CMS 2.4 和 Django 1.5 与用户配置文件一起使用,而不是自定义用户模型。 (我误读了此处的 Django 文档,并认为 Django 1.5 不支持用户配置文件。) 您通常可以在没有用户配置文件或自定义用户模型的情况下逃脱 - 它们最适合用于添加专门用于用户身份验证的数据。相反,您可以使用与 User 一对一关系的另一个模型,并使用反向关系来访问它。

就我而言,我将在短期内选择#3,在长期内选择#4。

希望有帮助!

【讨论】:

感谢赛车蝌蚪!正如你一样,从长远来看,我将选择#3 和#4。文档不是很清楚 + Dajngo2Scoops 书说“选项 3:子类 AbstractBaseUser”:AbstractBaseUser 是基本选项:密码,上次登录,并且是活动的。 1) 你对 User 模型默认提供的字段不满意,例如名字和姓氏。 2)您更喜欢从一个非常简单的干净石板中进行子类化,但希望利用 AbstractBaseUser 理智的默认方法来存储密码。

以上是关于django 1.5 扩展默认用户模型或替换它的主要内容,如果未能解决你的问题,请参考以下文章

何时在 Django 1.5 中使用自定义用户模型

如何在mongodb中扩展django的默认用户?

我可以在不创建自定义用户的情况下更改 Django 1.5 中的 USERNAME_FIELD 吗?

如何正确扩展 django 用户模型

Django 重写用户模型

在 Django 中覆盖默认用户模型后无法登录