自定义UserModel

环境:django 1.9.11+python 2.7

from django.contrib.auth.models import AbstractUser

class UserProfile(AbstractUser):        // AbstractUser是Django自带的UserModel父类,在继承的基础上添加新的用户字段
nick_name = models.CharField(max_length=50, verbose_name=u"昵称", default="")
birday = models.DateField(verbose_name=u"生日", null=True, blank=True)
gender = models.CharField(max_length=7, choices=(("male", u"男"),("female", u"女")), default="female")
address = models.CharField(max_length=100, default="")
mobile = models.CharField(max_length=11, null=True, blank=True)
image = models.ImageField(upload_to="image/%Y/%m", default=u"image/default.png", max_length=100) class Meta:
verbose_name = "用户信息"
verbose_name_plural = verbose_name def __unicode__(self):
return self.username settings.py
AUTH_USER_MODEL = "users.UserProfile" // 要让自定义UserModel生效,需要在settings文件中声明

  

自定义UserModel认证和登录

from django.shortcuts import render
from django.contrib.auth import authenticate, login
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from django.views.generic.base import View from .models import UserProfile class CustomBackend(ModelBackend): // 首先需要重写认证后台的authenticate方法,因为默认的authenticate方法验证的是自带的UserModel
def authenticate(self, username=None, password=None, **kwargs):
try:
user = UserProfile.objects.get(Q(username=username)|Q(email=username)) // Q这个函数表达一种或的关系,即账号既可以是用户名也可以是邮箱
if user.check_password(password): // 之前继承的AbstractUser中自带了一个check_password方法,作用是将密码转换为密文进行验证
return user // authenticate方法取得对象并验证密码成功后会返回user对象
except Exception as e: // get()方法当获取不到值时会出现异常,check_password()不成功也会有异常
return None // 出现异常则返回None class LoginView(View):
def get(self, request):
return render(request, "login.html", {}) def post(self, request):
login_form = LoginForm(request.POST)
if login_form.is_valid():
user_name = request.POST.get("username", "")
pass_word = request.POST.get("password", "")
user = authenticate(username=user_name, password=pass_word) // 这里会调用重写后的authenticate方法
if user is not None:
login(request, user) // 调用login()方法进行登录,实际上是对request进行一些操作,把user写入request
return render(request, "index.html")
else:
return render(request, "login.html", {"msg": u"用户名或密码错误", "login_form":login_form}) settings.py // 对于自定义认证后台,同样需要在settings文件中进行声明 AUTHENTICATION_BACKENDS = (
'users.views.CustomBackend',
)

  

最新文章

  1. SQL Azure (16) 创建PaaS SQL Azure V12数据库
  2. SQL Server 查询树结构的表,查询一个节点的所有子节点
  3. Redis快速入门详解
  4. C++ 基础 const放在函数末尾的意思
  5. VB中的属性、方法和事件概念解析
  6. sql删除多余重复的数据只保留一条
  7. 26.68013 烧录方式 及iic生成
  8. Codeforces Round #364 (Div. 2) E. Connecting Universities
  9. 简析Android 兼容性测试框架CTS使用
  10. 【深度学习系列】用PaddlePaddle和Tensorflow实现GoogLeNet InceptionV2/V3/V4
  11. linux的link命令
  12. springmvc的前端控制器
  13. 将springboot打包成的jar文件做成windows服务,解决java程序自启动问题
  14. HTML: Dom event
  15. eclipse无法连接到makertplace
  16. Jupyter Notebook 工作空间 / 默认路径 的设置方式
  17. Weird journey CodeForces - 788B (路径计数)
  18. PHP中的urlencode,rawurlencode和JS中的encodeURI,encodeURIComponent
  19. 学霸网站-Alpha版本发布说明
  20. 170509、文本编辑器编写的shell脚本在linux下无法执行的解决方法

热门文章

  1. BZOJ4881 线段游戏(二分图+树状数组/动态规划+线段树)
  2. grub引导启动 win10 Ubantu 凤凰OS 三系统
  3. Ajax+Js局部刷新
  4. NOIP2015运输计划题解报告
  5. Linux基础--------监控系统、进程管理、软件包管理-------free、dd、kill、 rpm、yum、源码安装python
  6. 【数据结构】【平衡树】treap
  7. java发送邮件功能[转]
  8. poj3421 X-factor Chains
  9. python学习笔记(六) 函数式编程
  10. 《深入Java虚拟机》笔记