扩展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类都无关紧要。
与我所做的相似,但我生活在模型继承。 – 2010-11-30 14:01:34