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

问题描述:

我想扩展User模型,所以我可以放入一些额外的字段和函数(不仅是字段,请记住,否则(好吧,仍然)我可以使用get_profile(),我认为这很丑陋)。扩展Django用户模型(使其在request.user中工作),Django 1.2.3

此外,我想使用新的扩展用户模型中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_field和extra_function不在用户模型中。

现在我发现了一个方法来完成这个,使用认证后端,这是一个有点复杂,我不能在Django 1.2.3中工作。

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

CUSTOM_USER_MODEL = 'accounts.CustomUser' 

进一步尝试了其他一些方法,如使用信号,这没有奏效。对我来说,唯一的解决方案似乎是调整Django中的用户模型(这不是一个优雅的解决方案,调整Django的源代码,但代码方面是一个很好的解决方案)。

所以我正在寻找这个解决方案..有没有人做过这个?

感谢现在

斯特凡

你是正确的轨道调整认证后端上。

身份验证后端可以非常简单,这是我们在我们的项目中使用的剪辑。

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 duck typing。只要您创建的用户模型具有与Django查找的相同接口(方法,字段),则无论它是否实际为其指定的User类都无关紧要。

+0

与我所做的相似,但我生活在模型继承。 – 2010-11-30 14:01:34