Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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
向Django Auth用户模型添加便利方法的最佳方法?_Django_Django Models_Django Authentication - Fatal编程技术网

向Django Auth用户模型添加便利方法的最佳方法?

向Django Auth用户模型添加便利方法的最佳方法?,django,django-models,django-authentication,Django,Django Models,Django Authentication,我想向django.contrib.auth.models.User模型添加一个方便的/model方法。这样做的最佳实践是什么?上次我检查时,扩展用户模型被认为是不好的实践 我有一个单独的自定义UserProfile模型。我是否应该将其用于所有与用户相关的便利方法?是。如果您的用户模型附带了.get_profile()函数,则无需修改基础。我更喜欢在我开发的各个项目中使用相同的用户配置文件,并扩展用户以满足任何项目特定的需要。因此,通用功能转到UserProfile,项目特定功能转到custom

我想向
django.contrib.auth.models.User
模型添加一个方便的/model方法。这样做的最佳实践是什么?上次我检查时,扩展用户模型被认为是不好的实践


我有一个单独的自定义
UserProfile
模型。我是否应该将其用于所有与用户相关的便利方法?

是。如果您的用户模型附带了.get_profile()函数,则无需修改基础。

我更喜欢在我开发的各个项目中使用相同的用户配置文件,并扩展用户以满足任何项目特定的需要。因此,通用功能转到UserProfile,项目特定功能转到custom User。我还没有因为拥有子类用户模型而产生任何负面影响,我想知道Django 1.0+是否还有任何负面影响。

这取决于您试图添加到模型中的内容。如果要添加有关用户的更多信息,通常建议您使用
UserProfile
方法:

但是,如果您只想向
用户
模型添加自定义方法或管理器,我认为使用代理模型更符合逻辑,如下所示:

from django.contrib.auth.models import User

class UserMethods(User):
  def custom_method(self):
    pass
  class Meta:
    proxy=True
代理模型将在与原始模型相同的数据库表上操作,因此非常适合创建自定义方法,而无需物理扩展模型。只需将视图中对
User
的任何引用替换为
UserMethods
。(当然,您可以通过注销
用户
模型并注册代理模型来在管理工具中使用此功能。)

创建的原始
User
模型的任何实例都可以通过
UserMethods
模型立即访问,反之亦然。详情如下:

(注意:代理模型需要Django 1.1及以上版本)

2013更新:


在1.5中,您可以替代自定义用户模型并添加任何您想要的内容

如果您想向用户模型添加自定义方法,我建议:

在任何
应用程序中创建文件
monkey\u patching.py

#app/monkey_patching.py
from django.contrib.auth.models import User 

def get_user_name(self):
    if self.first_name or self.last_name:
        return self.first_name + " " + self.last_name
    return self.username

User.add_to_class("get_user_name",get_user_name)
并将其导入应用程序的
\uuuu init\uuuu.py
文件中。ie::

#app/__init__.py
import monkey_patching

+1、仍然不建议扩展用户模型,并且配置文件的所有管道都已经存在。您可以在配置文件模型上添加一个
OneToOne
字段,并调用
User\u实例。配置文件
而不是使用
get\u profile()
。很好的调用!完全忘记了代理模型。我运行的是1.1,但我的思维方式是1.0。是否有一种简单的方法可以将request.user的类型更改为代理类型?这是必要的,还是我可以在请求时直接调用代理方法。用户?我和@slacy有同样的疑问,并找到了一种解决方法:。基本上,您必须子类化django.contrib.auth.backends.modelbend,在get_user上返回UserMethods,并在AUTHENTICATION_backends上设置它。到django文档的链接现在已断开。有人知道新的网址吗?