Django 自定义用户模块

1、概述

Django中自带的User Model使用起来是比较方便的,但是通常我们的需求使用原生的User Model并不合适,或者少了一些必要的属性,或者多了些不必要的属性,这时就需要使用我们自己的User Model,自定义用户模块。
参考:Django官方文档 “Customizing authentication in Django” 部分,文档最后有完整的例子。
虽然自定义了用户模块,但是仍然可以使用Django原有的用户认证机制。
主要包含三个步骤
1. 定义自己的用户模块,包含用户类及用户Manager 类继承自Django中的 AbstractBaseUser、BaseUserManager
2. 将自己定义的用户模块注册到Django的admin,即将自己的模块注册到Django的后台管理系统
3. 在settings.py中设置AUTH_USER_MODEL=“自定义用户模块类”

2、操作步骤

2.1 定义自己的用户模块

在自己的用户认证app的model.py中定义两个类,用户类和用户Manager类。
用户类:名字自定义,该例中名字为SysUser,该类继承自AbstractBaseUser,为了使用Django permission 框架,需再继承 PermissionsMixin。该类主要定义了用户的属性。
用户Manager类:名字自定义,该例中名字为SysUserManager,该类继承 BaseUserManager,主要重定义create_user、create_superuser这两个函数。

点击(此处)折叠或打开

  1. from django.db import models
  2. from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser)
  3. # Create your models here.


  4. class SysUserManager(BaseUserManager):
  5.     def create_user(self, username, password=None):
  6.         """
  7.         Creates and saves a User with the username
  8.         """

  9.         user = self.model(
  10.             username=username,
  11.         )


  12.         user.set_password(password)
  13.         user.save(using=self._db)
  14.         return user


  15.     def create_superuser(self, username, password):
  16.         """
  17.         Creates and saves a superuser
  18.         """
  19.         user = self.create_user(username,password)


  20.         user.is_admin = True
  21.         user.save(using=self._db)
  22.         return user


  23. class SysUser(AbstractBaseUser, PermissionsMixin):
  24.     username = models.CharField(max_length=20, unique=True,)
  25.     full_name = models.CharField(max_length=20,default="姓名")
  26.     user_group = models.CharField(max_length=10,default="NULL")
  27.     is_active = models.BooleanField(default=True)
  28.     is_admin = models.BooleanField(default=False)


  29.     objects = SysUserManager()


  30.     USERNAME_FIELD = 'username'
  31.     #REQUIRED_FIELDS = ['full_name']


  32.     def __str__(self):
  33.         return self.username


  34.     def has_perm(self, perm, obj=None):
  35.         "Does the user have a specific permission?"
  36.         # Simplest possible answer: Yes, always
  37.         return True


  38.     def has_module_perms(self, app_label):
  39.         "Does the user have permissions to view the app `app_label`?"
  40.         # Simplest possible answer: Yes, always
  41.         return True


  42.     @property
  43.     def is_staff(self):
  44.         "Is the user a member of staff?"
  45.         # Simplest possible answer: All admins are staff
  46.         return self.is_admin

2.2 注册到Django Admin

在用户认证app的admin.py中必须定义的两个类, UserCreationForm和UserChangeForm,其他可以自定义的类参考Django官方文档。

点击(此处)折叠或打开

  1. from django.contrib import admin
  2. from django import forms
  3. from django.contrib.auth.models import Group
  4. from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
  5. from django.contrib.auth.forms import ReadOnlyPasswordHashField
  6. from myauth.models import SysUser

  7. # Register your models here.


  8. class UserCreationForm(forms.ModelForm):
  9.     """A form for creating new users. Includes all the required
  10.        fields, plus a repeated password."""
  11.     password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
  12.     password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

  13.     class Meta:
  14.         model = SysUser
  15.         fields = ('username', 'full_name', 'user_group','is_active','is_admin')

  16.     def clean_password2(self):
  17.         # Check that the two password entries match
  18.         password1 = self.cleaned_data.get("password1")
  19.         password2 = self.cleaned_data.get("password2")
  20.         if password1 and password2 and password1 != password2:
  21.             raise forms.ValidationError("Passwords don't match")
  22.         return password2

  23.     def save(self, commit=True):
  24.         # Save the provided password in hashed format
  25.         user = super().save(commit=False)
  26.         user.set_password(self.cleaned_data["password1"])
  27.         if commit:
  28.             user.save()
  29.         return user


  30. class UserChangeForm(forms.ModelForm):
  31.     """A form for updating users. Includes all the fields on
  32.     the user, but replaces the password field with admin's
  33.     password hash display field.
  34.     """
  35.     #password = ReadOnlyPasswordHashField()

  36.     class Meta:
  37.         model = SysUser
  38.         fields = ('username', 'password', 'full_name', 'user_group','is_active','is_admin')


  39. class SysUserAdmin(BaseUserAdmin):
  40.     # The forms to add and change user instances
  41.     form = UserChangeForm
  42.     add_form = UserCreationForm

  43.     # The fields to be used in displaying the User model.
  44.     # These override the definitions on the base UserAdmin
  45.     # that reference specific fields on auth.User.
  46.     list_display = ('username', 'full_name', 'user_group', 'is_active', 'is_admin')
  47.     list_filter = ('is_admin',)
  48.     fieldsets = (
  49.         (None, {'fields': ('username','full_name','user_group','is_active')}),
  50.         ('Permissions', {'fields': ( 'is_admin',)}),
  51.     )
  52.     # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
  53.     # overrides get_fieldsets to use this attribute when creating a user.
  54.     add_fieldsets = (
  55.         (None, {
  56.             'classes': ('wide',),
  57.             'fields': ('username', 'password1', 'password2',)}
  58.          ),
  59.     )
  60.     search_fields = ('username',)
  61.     ordering = ('username',)
  62.     filter_horizontal = ()

  63.     # Now register the new UserAdmin...


  64. admin.site.register(SysUser, SysUserAdmin)
  65. # ... and, since we're not using Django's built-in permissions,
  66. # unregister the Group model from admin.
  67. admin.site.unregister(Group)

2.3 修改AUTH_USER_MODEL

修改项目settings.py 中AUTH_USER_MODEL='myauth.SysUser'

点击(此处)折叠或打开

  1. AUTH_USER_MODEL = 'myauth.SysUser'


这样就可以使用自己的用户模块了。




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31535516/viewspace-2157153/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31535516/viewspace-2157153/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值