很多时候我们需要重写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'
|