Python 扩展Django用户模型(使其在request.User中工作),Django 1.2.3

Python 扩展Django用户模型(使其在request.User中工作),Django 1.2.3,python,django,model,django-1.2,Python,Django,Model,Django 1.2,我想扩展用户模型,这样我就可以添加一些额外的字段和函数(记住,不仅仅是字段,否则(好吧,仍然)我可以使用get_profile(),我认为这很难看) 我还想在request.User中使用新的扩展用户模型,如下所示: 扩展用户模型: # imports etc class CustomUser(User): extra_field = ... def extra_function(self): ... return ... 示例使用视图:

我想扩展用户模型,这样我就可以添加一些额外的字段和函数(记住,不仅仅是字段,否则(好吧,仍然)我可以使用get_profile(),我认为这很难看)

我还想在request.User中使用新的扩展用户模型,如下所示:

扩展用户模型:

# imports etc

class CustomUser(User):
    extra_field = ...

    def extra_function(self):
        ...

        return ...
示例使用视图:

# imports etc

def extra_function_view(request):
    print request.user.username
    print request.user.extra_field

    request.user.extra_function()

    return HttpResponse( ... )
上面的代码显然不起作用,因为用户模型中不包含extra_字段和extra_函数

现在我找到了一种方法来实现这一点,使用身份验证后端,这有点复杂,在Django 1.2.3中无法使用

AUTHENTICATION_BACKENDS = (
    'myproject.auth_backends.CustomUserModelBackend',
)
...

CUSTOM_USER_MODEL = 'accounts.CustomUser'
更多的人尝试了一些其他的方法,比如使用信号,但都不起作用。对我来说,唯一的解决方案似乎是调整Django中的用户模型(这不是一个优雅的解决方案,调整Django的源代码,但在代码方面是一个整洁的解决方案)

所以我正在寻找一个解决方案。。以前有人这样做过吗

现在谢谢你


Stefan

调整身份验证后端的方法是正确的

认证后端可以非常简单,下面是我们在项目中使用的一个片段

class LocalAccount(object):
    def authenticate(self, system=None, username=None, password=None):
        try:
            user = User.objects.get(system=system, alias=username)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        'returns user'

    def get_all_permissions(self, user_obj):
        'returns user permissions'

    def has_perm(self, user_obj, perm):
        'verifies permission, remember you can hardcode these'

    def get_group_permissions(self, user_obj):
        return set() #We don't use this

    def has_module_perms(self, user_obj, app_label):
        return False
这允许您返回希望返回的任何用户模型。只要您的用户模型与Django的用户模型基本相同,您就不会遇到任何问题

还要记住,扩展用户并包含应用程序将导致Django用户模型和您自己的用户模型都位于具有模型继承的数据库中。最好的选择是复制Django用户模型并对其进行修改。对于我们的项目,我们甚至没有在安装的应用程序设置中包含“auth”


这里的概念是Python。只要您创建的用户模型具有Django正在寻找的相同接口(方法、字段),它是否是它指定的用户类并不重要。

与我所做的类似,但我生活在模型继承中。完全可以理解和有效,这让我非常恼火:)那么你现在说什么?我需要为编辑原始Django用户模型而使用的身份验证后端?如果是这样的话,将contrib.auth目录复制到我自己的项目中就足够了,Django在将其添加到我的设置中时可以理解吗?您只需要订阅Django自己的用户模型界面的用户模型。在这之后,只需要验证后端返回用户模型而不是Djangos。