重写Django的User模型,扩展用户信息

原创
2021/03/19 15:14
阅读数 90

很多时候我们需要重写Django的User模型来满足我们的业务场景,那么废话不多说,咱们直接上代码,Copy可直接用的代码。

先来看下我的代码结构。 按照此结构,创建对应的文件,写入内容即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
.
├── LICENSE
├── README . md
├── app
│   ├── __init__ . py
│   ├── home
│   │   ├── __init__ . py
│   │   ├── admin . py
│   │   ├── apps . py
│   │   ├── migrations
│   │   ├── models . py
│   │   ├── tests . py
│   │   ├── urls . py
│   │   ├── user
│   │   │   ├── __init__ . py
│   │   │   ├── admin . py
│   │   │   └── models . py
│   │   └── views . py
├── dispatch
│   ├── __init__ . py
│   ├── settings . py
│   ├── urls . py
│   └── wsgi . py
├── manage . py
├── requirements . txt

app/home/user/admin.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : YuLei Lan
 
 
from django import forms
from django . contrib . auth . admin import UserAdmin as BaseUserAdmin
from django . contrib . auth . forms import ReadOnlyPasswordHashField
 
from app . home . models import UserProfile
 
 
class UserCreationForm ( forms . ModelForm ) :
     "" "A form for creating new users. Includes all the required
    fields, plus a repeated password." ""
     password1 = forms . CharField ( label = 'Password' , widget = forms . PasswordInput )
     password2 = forms . CharField (
         label = 'Password confirmation' , widget = forms . PasswordInput )
 
     class Meta :
         model = UserProfile
         fields = ( 'username' , 'name' )
 
     def clean_password2 ( self ) :
         # Check that the two password entries match
         password1 = self . cleaned_data . get ( "password1" )
         password2 = self . cleaned_data . get ( "password2" )
         if password1 and password2 and password1 != password2 :
             raise forms . ValidationError ( "Passwords don't match" )
         return password2
 
     def save ( self , commit = True ) :
         # Save the provided password in hashed format
         user = super ( UserCreationForm , self ) . save ( commit = False )
         user . set_password ( self . cleaned_data [ "password1" ] )
         if commit :
             user . save ( )
         return user
 
 
class UserChangeForm ( forms . ModelForm ) :
     "" "A form for updating users. Includes all the fields on
    the user, but replaces the password field with admin's
    password hash display field.
    " ""
     password = ReadOnlyPasswordHashField ( )
 
     class Meta :
         model = UserProfile
         fields = ( 'username' , 'first_name' , 'last_name' , 'password' , 'name' ,
                   'email' , 'is_active' , 'is_admin' )
 
     def clean_password ( self ) :
         # Regardless of what the user provides, return the initial value.
         # This is done here, rather than on the field, because the
         # field does not have access to the initial value
         return self . initial [ "password" ]
 
 
class UserAdmin ( BaseUserAdmin ) :
     # The forms to add and change user instances
     form = UserChangeForm
     add_form = UserCreationForm
 
     # The fields to be used in displaying the User model.
     # These override the definitions on the base UserAdmin
     # that reference specific fields on auth.User.
     list_display = ( 'username' , 'email' , 'name' , 'is_admin' )
     list_filter = ( 'is_admin' , )
     fieldsets = ( ( None , {
         'fields' : ( 'username' , 'password' )
     } ) , ( ( 'Personal info' ) , {
         'fields' : ( 'first_name' , 'last_name' , 'email' )
     } ) , ( ( 'Permissions' ) , {
         'fields' : ( 'is_active' , )
     } ) )
     # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
     # overrides get_fieldsets to use this attribute when creating a user.
     add_fieldsets = ( ( None , {
         'classes' : ( 'wide' , ) ,
         'fields' : ( 'username' , 'name' , 'password1' , 'password2' )
     } ) , )
     search_fields = ( 'username' , )
     ordering = ( 'username' , )
     filter_horizontal = ( )

app/home/user/models.py

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : YuLei Lan
 
from django . db import models
from django . contrib . auth . models import ( BaseUserManager , AbstractBaseUser )
 
class UserProfileManager ( BaseUserManager ) :
     def create_user ( self , password = None , * * kwargs ) :
         "" "
        Creates and saves a User with the given username, date of
        birth and password.
        " ""
         if not kwargs :
             raise ValueError ( 'Users must have an username address' )
 
         # 开始创建账号
         user = self . model ( * * kwargs )
         # 设置密码
         user . set_password ( password )
         user . save ( using = self . _db )
         return user
 
     # 创建管理员
     def create_superuser ( self , * * kwargs ) :
         "" "
        Creates and saves a superuser with the given username, date of
        birth and password.
        " ""
         user = self . create_user ( * * kwargs )
         user . is_admin = True
         user . save ( using = self . _db )
         return user
 
 
# 在这里设置你需要的字段
class UserProfile ( AbstractBaseUser ) :
     username = models . CharField (
         verbose_name = 'username' ,
         max_length = 128 ,
         unique = True , )
     email = models . EmailField (
         verbose_name = 'email' ,
         max_length = 255 ,
         null = True ,
         blank = True ,
         unique = True , )
     first_name = models . CharField (
         verbose_name = '名字' , max_length = 64 , null = True , blank = True )
     last_name = models . CharField (
         verbose_name = '姓' , max_length = 64 , null = True , blank = True )
     name = models . CharField ( max_length = 128 , null = True , blank = True )
     phone = models . CharField ( max_length = 128 , null = True , blank = True )
     qq = models . CharField ( max_length = 128 , null = True , blank = True )
     wechat = models . CharField ( max_length = 128 , null = True , blank = True )
     sex = models . CharField ( max_length = 45 , null = True , blank = True )
     is_active = models . BooleanField ( verbose_name = '是否可用' , default = True )
     is_admin = models . BooleanField ( verbose_name = '是否管理员' , default = False )
     create_date = models . DateTimeField (
         auto_now_add = True , blank = True , null = True )
     update_date = models . DateTimeField ( blank = True , null = True , auto_now = True )
     objects = UserProfileManager ( )
 
     # 使用username作为必须的字段
     USERNAME_FIELD = 'username'
     REQUIRED_FIELDS = [ 'name' , 'email' ]
 
     def get_full_name ( self ) :
         # The user is identified by their username address
         return self . username
 
     def get_short_name ( self ) :
         # The user is identified by their username address
         return self . username
 
     def __unicode__ ( self ) :    # __unicode__ on Python 2
         return self . username
 
     def has_perm ( self , perm , obj = None ) :
         "" "
        Return True if the user has the specified permission. Query all
        available auth backends, but return immediately if any backend returns
        True. Thus, a user who has permission from a single auth backend is
        assumed to have permission in general. If an object is provided, check
        permissions for that object.
        " ""
         # Active superusers have all permissions.
         if self . is_active and self . is_admin :
             return True
 
     def has_perms ( self , perm , obj = None ) :
         "Does the user have a specific permission?"
         # Simplest possible answer: Yes, always
         return True
 
     def has_module_perms ( self , app_label ) :
         "Does the user have permissions to view the app `app_label`?"
         # Simplest possible answer: Yes, always
         return True
 
     @ property
     def is_staff ( self ) :
         "Is the user a member of staff?"
         # Simplest possible answer: All admins are staff
         return self . is_admin
 
     class Meta :
         db_table = 'home_user_profile'
         verbose_name = '用户管理'
         verbose_name_plural = "用户管理"

dispatch/settings.py

1
AUTH_USER_MODEL = 'home.UserProfile'
展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部