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

时间:2013-05-17 09:14:30

标签: django django-models django-authentication django-cms django-users

环境:Django 1.5.1 + Django CMS 2.4.1 + Zinnia最新+我的自定义应用+自定义Django CMS插件

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

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

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

但我有以下错误:

  

notification.noticesetting:'user'定义与模型的关系   'auth.User',已被换出。将关系更新为point   在settings.AUTH_USER_MODEL。 cmsplugin_zinnia.latestentriesplugin:   'authors'定义了与模型'auth.User'的关系,它具有   被换掉了。更新指向的关系   settings.AUTH_USER_MODEL。

     

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

经过几个小时的阅读和测试后,我找到了

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

  

正如错误消息所示 - 您需要将关系更新为point   在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 页/插件。

- 用户的几个字段。

Subclass AbstractUser是正确的吗?

如何解决“换出”错误?

我应该创建类似于OpenTreeMap Code

的内容

此代码是否已弃用?

谢谢!

2 个答案:

答案 0 :(得分:5)

有一个非常简单的解决方案。只需在导入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

答案 1 :(得分:1)

以下是https://github.com/divio/django-cms/issues/1798进一步讨论的摘要。

有四种可能的选择:

  1. 如果您需要自定义用户模型的名称不是User,则需要等待。
  2. 您可以调用自定义用户模型User - 但是当我尝试这个时,我遇到了与相关m2m字段冲突的错误。上述链接有一些进一步的细节可能有助于解决这个问题。
  3. Django 1.5仍允许您使用用户个人资料。因此,如果您可以使用已弃用的功能,您仍然可以将Django-CMS 2.4和Django 1.5与用户配置文件一起使用,而不是使用自定义用户模型。 (我在这里误读了Django文档,并认为Django 1.5不支持用户配置文件。)
  4. 您通常可以在没有用户配置文件或自定义用户模型的情况下离开 - 它们最适合用于添加专门用于用户身份验证的数据。相反,您可以使用与User具有一对一关系的其他模型,并使用反向关系来访问它。
  5. 对于我的情况,我将在短期内使用#3,在长期运行中使用#4。

    希望有所帮助!