扩展Django用户模型(使其在request.user中有效),Django 1.2.3
我想扩展用户模型,这样我就可以添加一些额外的字段和功能(不仅仅是字段,记住这一点,否则我可以使用 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_field 和 extra_function 并不在用户模型中。
现在我找到了一种方法可以实现这个,使用一种认证后端,这有点复杂,而且我在 Django 1.2.3 中无法让它工作。
AUTHENTICATION_BACKENDS = (
'myproject.auth_backends.CustomUserModelBackend',
)
...
CUSTOM_USER_MODEL = 'accounts.CustomUser'
此外,我还尝试了一些其他方法,比如使用信号,但也没有成功。对我来说,唯一的解决方案似乎是在 Django 中调整用户模型(虽然这不是一个优雅的解决方案,调整 Django 的源代码,但从代码的角度来看是个不错的解决方案)。
所以我在寻找这个问题的解决方案……有没有人之前做过这个?
谢谢大家
Stefan
1 个回答
2
你在调整认证后端的方向上是对的。
认证后端其实可以很简单,下面是我们项目中用到的一段代码。
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指定的用户类就无所谓了。