2

由于各种复杂的原因[1],我需要向 Django User 类添加额外的属性。

我既不能使用 Profile 也不能使用“继承”方式来做到这一点。(如在 Django 中使用自定义字段扩展用户模型

所以我一直在做的是在我的 local_settings 文件中包含 User 类。并在那里添加属性。

或许令人惊讶的是,这似乎在许多情况下都有效。但不是当我从 UserManager.create_user() 创建一个新用户时。所以我需要修补 UserManager.create_user() 方法的替代方法。查看源代码(在 contrib.auth.models.py 中),我发现它用于创建用户的类保存在名为 UserManager.model 的属性中,而不是直接引用。

这条线是这样的:

user = self.model(None, username, '', '', email.strip().lower(), 'placeholder', False, True, False, now, now)

问题是这个 self.model(我假设它包含对 User 类的引用)似乎不是我的修补版本。

那么,有谁知道在 UserManager 的情况下这个 self.model 是在哪里设置的?以及我是否正确假设此时代码尚未通过 local_settings 所以我对 User 类的补丁不存在?如果有更好的地方来修补课程?

干杯

菲尔

[1] 满足好奇心。我需要让 User 类使用数据库中不同的现有表,该表具有额外的字段和约束。

更新:为了将来参考,看起来代理模型是 Django 支持我需要的方式: http: //code.djangoproject.com/ticket/10356

4

3 回答 3

2

具有特定于站点的用户字段的常用方法是在您的 settings.py 中指定用户配置文件表。然后,您可以通过 u.user_profile() 方法检索特定设置。它在文档中有很好的记录。

于 2009-06-08T12:13:04.480 回答
2

如果 Django 1.1 beta 对你来说不是太前沿,试试代理模型。

于 2009-06-08T20:23:34.237 回答
2

您可能只需要确保尽可能早地进行替换/添加/猴子补丁(在实际安装身份验证应用程序之前)。但问题是模型类做了一些元类的东西,这可能可以解释为什么 UserManager 有错误的类 - 因为它会生成原始类,用那个类设置 UserManager,然后你会做你的东西事情不会一样了。

所以简而言之,当你更换班级时要残酷。如果您可以扩展原始类,则将原始类替换为扩展版本:


import django.contrib.auth.models
from django.contrib.auth.models import User as OriginalUser

class User(OriginalUser):
    pass # add your extra fields etc

# then patch the module with your new version
django.contrib.auth.models.User = User

或者,如果这不起作用,请在新类中复制 User 类,然后将其修补。

这有点脏,但它可能会做你想做的事。

于 2009-06-08T14:47:17.430 回答