注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

哈欠涟涟的博客

学习python、pyqt与django

 
 
 

日志

 
 

通过继承User来扩展django user models  

2010-10-27 10:52:32|  分类: django |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
学习http://scottbarnham.com/blog/2008/08/后记录
from django.contrib.auth.models import User,UserManager

class CustomUser(User):
  '''User with app settings'''
  timezone = models.CharField(max_length=50,default='Europe/London')

  # 使用UserManager来获取创建用户的方法(create_user)等 
  objects = UserManager()

现在每个CustomUser的实例都用有一般User的字段与方法,并且还有拥有我们自己增加的字段与方法。我们增加了UserManager作为默认的管理器,则标准的方法是可用的。如建立一个user,可以按如下方法来做:
 user = CustomUser.objects.create(...)
如果通过User类来创建一个user的话,就无法得到CustomUser表中相应的字段。所以创建需要在
派生类中进行。而仍然可以获取与更新User model字段的值。
但有一个问题,当你利用request.user获取的user是一个User的实例,而不是CustomUser的实例,所以无法获取扩展的字段与方法。
为了解决这个问题,可以写自己的登录后台,获取CustomUser的实例而不是User的实例

在auth_backends.py中登录后台(auth_backends.py可以放在工程文件夹下)
from django.conf import settings
from django.contrib.auth.backends import ModelBackend
from django.core.exceptions import ImproperlyConfigured
from django.db.models import get_model

class CustomUserModelBackend(ModelBackend):
  def authenticate(self,username=None,password=None):
    try:
      user = self.user_class.objects.get(username=username)
      if user.check_password(password):
        return user
    except self.user_class.DoesNotExist:
      return None

  def get_user(self,user_id):
    try:
      return self.user_class.objects.get(pk=user_id)
    except self.user_class.DoesNotExist:
      return None

  @property
  def user_class(self):
    if not hasattr(self,'_user_class'):
      self._user_class = get_model(*settings.CUSTOM_USER_MODEL.split('.',2))
      if not self._user_class:
        raise ImproperlyConfigured('Could not get custom user model')
    return self._user_class

在settings.py设置
AUTHENTICATION_BACKENDS = (
  'myproject.auth_backends.CustomUserModelBackend',
)
...
CUSTOM_USER_MODEL = 'accounts.CustomUser'  # 如果CustomUser是在应用accounts下的models.py文件中

现在当你通过request.user来获取user,则它是CutomUser的实例了。

如此自定义用户后,利用manage.py syncdb与manage.py createsuperuser建立的用户不能正常登录,原因是这样建立的用户,在customuser表中没有相关的记录,而登录时则自动到这个表中查找用户,但找不到,所以无法登录
  评论这张
 
阅读(2191)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017