Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:向用户类添加属性。在运行时和UserManager.create\u user更改它_Python_Django_Django Authentication_Patch - Fatal编程技术网

Python Django:向用户类添加属性。在运行时和UserManager.create\u user更改它

Python Django:向用户类添加属性。在运行时和UserManager.create\u user更改它,python,django,django-authentication,patch,Python,Django,Django Authentication,Patch,出于各种复杂的原因[1],我需要向Django用户类添加额外的属性 我既不能使用个人资料,也不能使用“继承”方式。(如中所示) 所以我一直在做的就是在我的本地设置文件中包含User类。并将属性添加到其中 也许令人惊讶的是,这似乎在许多情况下都有效。但当我从UserManager.create_User()创建新用户时就不会了。因此,我需要修补UserManager.create_user()方法的替代方法。查看该类的源代码(在contrib.auth.models.py中),我发现它用于创建用户

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

我既不能使用个人资料,也不能使用“继承”方式。(如中所示)

所以我一直在做的就是在我的本地设置文件中包含User类。并将属性添加到其中

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

这条线是这样的:

user=self.model(无,用户名,,'',email.strip().lower(),'placeholder',False,True,False,now,now)

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

那么,有人知道UserManager的self.model设置在哪里吗?我是否正确地认为,在这一点上,代码没有经过本地_设置,因此我的用户类补丁不存在?如果有更好的地方来修补这个课程呢

干杯

菲尔

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


更新:为便于将来参考,Django似乎将以代理模型的方式支持我需要的内容:

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

您可能只需要确保尽早(在实际安装auth应用程序之前)完成替换/添加/monkey补丁。但问题是,模型类做了一些元类的事情,这可能解释了为什么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
或者,如果这不起作用,请在新类中复制用户类,然后将其修补


这一切都有点脏,但它可以做你想做的。

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

不能使用配置文件?大多数情况下,这是造成灾难的原因。配置文件工作,易于使用。很难想象无法使用配置文件的情况。请提供一些关于为什么不能使用标准的、受支持的、简单的解决方案的见解。是的。我不能使用配置文件,因为事实上我已经将用户映射到另一个系统的旧表。由于该表中的约束,我必须添加额外的字段。您是否试图通过共享另一个应用程序的用户表来实现某种单一登录?你是在说另一个身份验证源吗?我不确定我是否理解您的用例。是的,但正如我在问题中提到的,在这种特殊情况下,我不能这样做。我认为你应该能够在创建新用户时通过使用信号创建配置文件来做到这一点。这看起来确实非常有希望。。。如果不是流血太多,那么新版本似乎很快就要面世了。他们现在为1.1里程碑打开了大约五个bug。上周的数字是15左右。看见