「入行全棧 Django3.x 個人主頁網站全記錄」3.使用者應用開發
專案彙總
內容介紹
User 後臺功能開發和配置。
其中專案中資料遷移部分不做說明,執行CMD命令。
python manage。py makemigrations
# 遷移到我們資料庫
python manage。py migrate
# 同步到資料庫
內容展示
應用建立&配置
1.建立應用
進入檔案根目錄執行CMD命令建立新聞資訊應用,並將建立好的應用資料夾移動到目錄的apps下即可。
cd
MyHome
python manage。py startapp User
將建立好的應用資料夾移動到目錄的apps下即可
2.配置應用模組
在settings。py檔案中修改
INSTALLED_APPS
=
[
。。。
# 新增文章應用
‘apps。User’
,
3.不需要修改該的檔案
admin.py
這個我們使用xadmin代替的原有版本的admin,因此這個檔案不需要修改該
apps.py
應用的配置檔案,不需要動
test.py
測試執行指令碼,不需要動
應用 models。py
# coding:utf-8
from
django。db
import
models
from
django。utils
import
timezone
from
django。contrib。auth。models
import
AbstractUser
# 使用者列表模型
class
UserProfile
(
AbstractUser
):
actual_name
=
models
。
CharField
(
max_length
=
10
,
verbose_name
=
“使用者姓名”
,
null
=
True
,
blank
=
True
,
unique
=
False
)
nick_name
=
models
。
CharField
(
max_length
=
20
,
verbose_name
=
“使用者暱稱”
,
null
=
True
,
blank
=
True
,
unique
=
False
)
GENDER_CHOICES
=
(
(
“Male”
,
“男性”
),
(
“Female”
,
“女性”
),
(
“Undefined”
,
“未定義”
)
)
gender
=
models
。
CharField
(
max_length
=
9
,
verbose_name
=
“使用者性別”
,
choices
=
GENDER_CHOICES
,
default
=
“未定義”
)
birthday
=
models
。
DateField
(
verbose_name
=
“使用者生日”
,
null
=
True
,
blank
=
True
)
address
=
models
。
CharField
(
max_length
=
100
,
verbose_name
=
“聯絡地址”
,
default
=
“”
,
blank
=
True
)
mobile
=
models
。
CharField
(
max_length
=
11
,
verbose_name
=
“聯絡電話”
,
null
=
True
,
blank
=
True
)
user_image
=
models
。
ImageField
(
upload_to
=
“media/UserImage/%Y/%m”
,
default
=
“media/UserImage/default。png”
,
verbose_name
=
“使用者頭像”
,
null
=
True
,
blank
=
True
)
ROLE_CHOICES
=
(
(
“Root”
,
“超級管理員”
),
(
“EditUser”
,
“編輯”
),
(
“ReviewUser”
,
“稽核”
),
(
“WebsiteUsers”
,
“網站使用者”
),
(
“Tourist”
,
“遊客”
)
)
user_role
=
models
。
CharField
(
max_length
=
20
,
verbose_name
=
“使用者角色”
,
choices
=
ROLE_CHOICES
,
default
=
“遊客”
)
integral
=
models
。
IntegerField
(
default
=
0
,
verbose_name
=
“使用者積分”
)
vip_level
=
models
。
IntegerField
(
default
=
0
,
verbose_name
=
“使用者等級”
)
vip_exp
=
models
。
IntegerField
(
default
=
0
,
verbose_name
=
“使用者經驗”
)
class
Meta
:
verbose_name
=
“使用者資訊列表”
verbose_name_plural
=
verbose_name
def
__str__
(
self
):
return
self
。
username
# 使用者訂閱模型
class
UserSubscription
(
models
。
Model
):
=
models
。
CharField
(
max_length
=
100
,
verbose_name
=
“使用者郵箱”
,
unique
=
False
)
created_date
=
models
。
DateTimeField
(
default
=
timezone
。
now
,
verbose_name
=
‘建立時間’
,
help_text
=
‘預設建立時系統時間’
)
class
Meta
:
verbose_name
=
“使用者訂閱列表”
verbose_name_plural
=
verbose_name
def
__str__
(
self
):
return
self
。
# 使用者郵件模型
class
UserEmailVerifyRecord
(
models
。
Model
):
username
=
models
。
CharField
(
max_length
=
150
,
default
=
“”
,
verbose_name
=
“使用者名稱”
,
help_text
=
“使用郵箱功能的使用者”
)
code
=
models
。
CharField
(
max_length
=
20
,
default
=
“”
,
verbose_name
=
“驗證碼”
,
help_text
=
“系統隨機生成的郵件驗證碼”
)
=
models
。
EmailField
(
max_length
=
100
,
default
=
“”
,
verbose_name
=
“郵箱”
,
help_text
=
“使用郵箱功能註冊的郵箱”
)
send_type
=
models
。
CharField
(
max_length
=
20
,
default
=
“”
,
verbose_name
=
“驗證碼型別”
,
help_text
=
“使用者使用郵件功能的型別”
)
send_time
=
models
。
DateTimeField
(
default
=
timezone
。
now
,
verbose_name
=
“郵件傳送時間”
,
help_text
=
‘預設建立時系統時間’
)
class
Meta
:
verbose_name
=
“郵箱功能列表”
verbose_name_plural
=
verbose_name
def
__str__
(
self
):
return
‘{0}({1})’
。
format
(
self
。
code
,
self
。
)
# 使用者瀏覽模型
class
UserRead
(
models
。
Model
):
user
=
models
。
ForeignKey
(
UserProfile
,
related_name
=
‘user_read’
,
on_delete
=
models
。
CASCADE
,
verbose_name
=
“使用者id”
,
help_text
=
“必須為Admin系統中的使用者”
)
article_slug
=
models
。
CharField
(
max_length
=
100
,
default
=
“”
,
verbose_name
=
“瀏覽文章slug”
,
help_text
=
“文章的slug資訊”
)
add_time
=
models
。
DateTimeField
(
default
=
timezone
。
now
,
verbose_name
=
“瀏覽時間”
,
help_text
=
‘預設建立時系統時間’
)
class
Meta
:
verbose_name
=
‘使用者瀏覽資訊’
verbose_name_plural
=
verbose_name
unique_together
=
(
“user”
,
“article_slug”
,
“add_time”
)
def
__str__
(
self
):
return
self
。
user
。
username
管理 adminx。py
# coding:utf-8
from
django。contrib。auth
import
get_user_model
import
xadmin
from
xadmin。layout
import
*
from
django。contrib。auth。forms
import
UserChangeForm
from
django。contrib。auth。forms
import
UserCreationForm
,
UsernameField
from
。models
import
*
# 獲取全域性user管理
User
=
get_user_model
()
# 自定義使用者建立表單(建立使用者應用密碼儲存為加密方式)
class
MyUserCreationForm
(
UserCreationForm
):
class
Meta
:
model
=
User
fields
=
(
“username”
,
“user_role”
)
field_classes
=
{
“username”
:
UsernameField
,
}
# 使用者資訊管理
class
UserProfileAdmin
(
object
):
list_display
=
[
‘username’
,
‘user_role’
,
‘nick_name’
,
‘integral’
,
‘email’
]
readonly_fields
=
[
‘date_joined’
,
‘last_login’
]
show_bookmarks
=
False
# 配置自定義使用者建立表MyUserCreationForm
def
get_model_form
(
self
,
**
kwargs
):
if
self
。
org_obj
is
None
:
self
。
form
=
MyUserCreationForm
else
:
self
。
form
=
UserChangeForm
return
super
(
UserProfileAdmin
,
self
)
。
get_model_form
(
**
kwargs
)
def
get_form_layout
(
self
):
if
self
。
org_obj
:
self
。
form_layout
=
(
Main
(
Fieldset
(
‘使用者基本資訊’
,
‘username’
,
‘actual_name’
,
‘nick_name’
,
‘gender’
,
‘address’
,
‘mobile’
,
‘email’
,
‘birthday’
,
),
Fieldset
((
‘登入資訊’
),
Row
(
‘last_login’
,
‘date_joined’
),
),
Fieldset
(
None
,
‘password’
,
‘user_permissions’
,
‘first_name’
,
‘last_name’
,
**
{
“style”
:
“display:None”
}),
),
Side
(
Fieldset
((
‘使用者’
),
‘user_image’
,
),
Fieldset
((
‘使用者許可權’
),
‘groups’
,
),
Fieldset
((
‘使用者身份’
),
‘user_role’
,
‘is_active’
,
‘is_staff’
,
‘is_superuser’
,
),
)
)
return
super
(
UserProfileAdmin
,
self
)
。
get_form_layout
()
# 使用者訂閱管理
class
UserSubscriptionAdmin
(
object
):
list_display
=
[
‘email’
,
‘created_date’
]
show_bookmarks
=
False
# 使用者郵件管理
class
UserEmailVerifyRecordAdmin
(
object
):
list_display
=
[
‘code’
,
‘email’
,
‘send_type’
,
‘send_time’
]
show_bookmarks
=
False
# 設定全部欄位只讀
def
get_readonly_fields
(
self
):
return
[
f
。
name
for
f
in
self
。
model
。
_meta
。
fields
]
# 使用者瀏覽管理
class
UserReadAdmin
(
object
):
list_display
=
[
‘user’
,
‘article_slug’
,
‘add_time’
]
show_bookmarks
=
False
xadmin
。
site
。
unregister
(
UserProfile
)
xadmin
。
site
。
register
(
UserProfile
,
UserProfileAdmin
)
xadmin
。
site
。
register
(
UserSubscription
,
UserSubscriptionAdmin
)
xadmin
。
site
。
register
(
UserEmailVerifyRecord
,
UserEmailVerifyRecordAdmin
)
xadmin
。
site
。
register
(
UserRead
,
UserReadAdmin
)
檢視 Views。py
# coding:utf-8
__author__
=
‘Mr。資料楊’
__explain__
=
‘users的views’
from
django。http
import
HttpResponseRedirect
,
HttpResponse
from
django。shortcuts
import
render
,
redirect
from
django。urls
import
reverse
from
django。views。generic。base
import
View
from
django。contrib
import
auth
from
django。contrib。auth。hashers
import
make_password
from
。Forms
import
*
from
django。db。models
import
Q
from
apps。StatisticalData。views
import
*
from
apps。Configuration。config_html
import
*
from
apps。Configuration。config_msg
import
*
from
apps。Configuration。config_utils
import
*
# 使用者註冊View
class
UserRegisterView
(
View
):
def
get
(
self
,
request
):
visit_info
(
request
,
“使用者註冊訪問”
)
register_form
=
RegisterForm
()
# CBV方式get註冊頁面
return
render
(
request
,
UserRegisterHtml
,
{
“register_form”
:
register_form
})
def
post
(
self
,
request
):
visit_info
(
request
,
“使用者註冊提交”
)
register_form
=
RegisterForm
(
request
。
POST
)
# 判斷註冊資訊的Form表單是否合法
if
register_form
。
is_valid
():
nick_name
=
request
。
POST
。
get
(
“nick_name”
)
tel
=
request
。
POST
。
get
(
“tel”
)
username
=
request
。
POST
。
get
(
“username”
)
=
request
。
POST
。
get
(
“email”
)
password
=
request
。
POST
。
get
(
“password”
)
# 驗證使用者填寫資訊
user_data
=
UserProfile
。
objects
。
filter
(
Q
(
username
=
username
)
|
Q
(
mobile
=
tel
)
|
Q
(
=
))
if
user_data
:
return
render
(
request
,
UserRegisterHtml
,
{
“register_form”
:
register_form
,
“msg”
:
ErrorRegisterMsg
})
else
:
user_profile
=
UserProfile
()
user_profile
。
username
=
username
user_profile
。
nick_name
=
nick_name
user_profile
。
=
user_profile
。
is_active
=
False
user_profile
。
password
=
make_password
(
password
)
user_profile
。
save
()
# 傳送密碼找回郵件到使用者郵箱
SendEmail
(
username
,
,
“register”
)
return
HttpResponseRedirect
(
reverse
(
“MyHomeIndex”
))
else
:
# 跳轉填寫Form錯誤提示
return
render
(
request
,
UserRegisterHtml
,
{
“register_form”
:
register_form
})
# 使用者登陸View
class
UserLoginView
(
View
):
def
get
(
self
,
request
):
visit_info
(
request
,
“使用者登入訪問”
)
login_form
=
LoginForm
()
return
render
(
request
,
UserLoginHtml
,
{
“login_form”
:
login_form
})
def
post
(
self
,
request
):
visit_info
(
request
,
“使用者登入提交”
)
login_form
=
LoginForm
(
request
。
POST
)
# 判斷登陸資訊的Form表單是否合法
if
login_form
。
is_valid
():
username
=
request
。
POST
。
get
(
“username”
)
# username資料
password
=
request
。
POST
。
get
(
“password”
)
# password資料
# 驗證使用者名稱和密碼是否匹配
user_info
=
auth
。
authenticate
(
username
=
username
,
password
=
password
)
# 判斷使用者是否存在
if
user_info
:
# 將使用者名稱存入session中
request
。
session
[
“user”
]
=
username
auth
。
login
(
request
,
user_info
)
# 將使用者資訊新增到session中
return
HttpResponseRedirect
(
reverse
(
“MyHomeIndex”
))
else
:
# 使用者不存在錯誤跳轉
return
render
(
request
,
UserLoginHtml
,
{
“msg”
:
ErrorLogin
})
else
:
# 使用者不存在錯誤跳轉
return
render
(
request
,
UserLoginHtml
,
{
“msg”
:
ErrorLogin
})
# 使用者登出View
class
UserLogoutView
(
View
):
def
get
(
self
,
request
):
visit_info
(
request
,
“使用者登出”
)
auth
。
logout
(
request
)
return
redirect
(
‘MyHomeIndex’
)
# 使用者忘密碼透過郵箱獲取郵件View
class
UserForgotPasswordView
(
View
):
def
get
(
self
,
request
):
visit_info
(
request
,
“使用者忘記密碼訪問”
)
forgot_form
=
ForgotForm
()
return
render
(
request
,
UserForgotPasswordHtml
,
{
“forgot_form”
:
forgot_form
})
def
post
(
self
,
request
):
visit_info
(
request
,
“使用者忘記密碼提交”
)
forgot_form
=
ForgotForm
(
request
。
POST
)
=
request
。
POST
。
get
(
“email”
)
# email資料
tel
=
request
。
POST
。
get
(
“tel”
)
# email資料
# 驗證使用者填寫資訊
user_data
=
UserProfile
。
objects
。
filter
(
=
,
mobile
=
tel
)
if
user_data
:
username
=
user_data
。
first
()
。
username
# 傳送密碼找回郵件到使用者郵箱
SendEmail
(
username
,
,
“forgot”
)
# 跳轉到主頁
return
redirect
(
reverse
(
“UserLogin”
))
else
:
return
render
(
request
,
UserForgotPasswordHtml
,
{
“forgot_form”
:
forgot_form
,
“msg”
:
ErrorForgotMsg
})
# 驗證郵件操作型別是否可以操作,其中有時效驗證環節
class
EmailVerifyRecordView
(
View
):
def
get
(
self
,
request
):
visit_info
(
request
,
“使用者驗證資訊訪問”
)
username
=
request
。
GET
。
get
(
‘Username’
)
=
UserProfile
。
objects
。
get
(
username
=
username
)
。
send_type
=
request
。
GET
。
get
(
‘Type’
)
code
=
request
。
GET
。
get
(
‘Code’
)
# 驗證使用者填寫資訊
email_verify
=
UserEmailVerifyRecord
。
objects
。
get
(
username
=
username
,
=
,
send_type
=
send_type
,
code
=
code
)
check_status
=
CheckTime
(
email_verify
。
send_time
)
# 驗證碼有效
if
check_status
:
if
send_type
==
‘forgot’
:
return
HttpResponseRedirect
(
reverse
(
‘UserResetPassword’
,
kwargs
=
{
‘Username’
:
username
,
‘Type’
:
send_type
,
‘Code’
:
code
,
}))
else
:
return
HttpResponse
(
“啟用碼郵件已過期或者驗證碼不正確,請重新註冊啟用!!!”
)
# 這裡未來製作一個視覺化頁面
# 使用者透過郵件重置密碼View
class
UserResetPasswordView
(
View
):
def
get
(
self
,
request
,
**
kwargs
):
visit_info
(
request
,
“使用者密碼重置訪問”
)
username
=
kwargs
[
‘Username’
]
reset_form
=
ResetForm
()
return
render
(
request
,
UserResetPasswordHtml
,
{
“reset_form”
:
reset_form
,
“username”
:
username
})
def
post
(
self
,
request
,
**
kwargs
):
visit_info
(
request
,
“使用者密碼重置提交”
)
username
=
kwargs
[
‘Username’
]
reset_form
=
ResetForm
(
request
。
POST
)
if
reset_form
。
is_valid
():
password
=
request
。
POST
。
get
(
“password”
)
re_password
=
request
。
POST
。
get
(
“re_password”
)
if
password
!=
re_password
:
return
render
(
request
,
UserResetPasswordHtml
,
{
“reset_form”
:
reset_form
,
“msg”
:
ErrorPasswordMsg
})
else
:
user_info
=
UserProfile
。
objects
。
get
(
username
=
username
)
password
=
make_password
(
password
,
None
,
‘pbkdf2_sha256’
)
user_info
。
password
=
password
user_info
。
save
()
return
render
(
request
,
ResetRedirectHtml
,
{
“msg”
:
SuccessResetMsg
})
else
:
return
render
(
request
,
UserResetPasswordHtml
,
{
“reset_form”
:
reset_form
,
“msg”
:
ErrorResetMsg
})
表單驗證 Forms。py
from
captcha。fields
import
CaptchaField
from
django
import
forms
# 登陸驗證
class
LoginForm
(
forms
。
Form
):
username
=
forms
。
CharField
(
required
=
True
)
password
=
forms
。
CharField
(
required
=
True
,
min_length
=
5
)
captcha
=
CaptchaField
(
error_messages
=
{
“invalid”
:
“驗證碼錯誤”
})
# 註冊驗證
class
RegisterForm
(
forms
。
Form
):
username
=
forms
。
CharField
(
required
=
True
)
=
forms
。
EmailField
(
required
=
True
)
password
=
forms
。
CharField
(
required
=
True
,
min_length
=
5
)
captcha
=
CaptchaField
(
error_messages
=
{
“invalid”
:
“驗證碼錯誤”
})
# 忘記密碼驗證
class
ForgotForm
(
forms
。
Form
):
=
forms
。
EmailField
(
required
=
True
)
tel
=
forms
。
CharField
(
required
=
True
)
captcha
=
CaptchaField
(
error_messages
=
{
“invalid”
:
“驗證碼錯誤”
})
# 重置密碼驗證
class
ResetForm
(
forms
。
Form
):
password
=
forms
。
CharField
(
required
=
True
,
min_length
=
5
)
re_password
=
forms
。
CharField
(
required
=
True
,
min_length
=
5
)
captcha
=
CaptchaField
(
error_messages
=
{
“invalid”
:
“驗證碼錯誤”
})
配置 url。py
# coding:utf-8
from
django。urls
import
path
,
re_path
from
。views
import
*
app_name
=
‘User’
urlpatterns
=
[
# 使用者註冊路由地址
path
(
‘UserRegister’
,
UserRegisterView
。
as_view
(),
name
=
‘UserRegister’
),
# 使用者登陸路由地址
path
(
‘UserLogin’
,
UserLoginView
。
as_view
(),
name
=
‘UserLogin’
),
# 使用者登出路由地址
path
(
‘UserLogout’
,
UserLogoutView
。
as_view
(),
name
=
‘UserLogout’
),
# 使用者忘記密碼路由地址
path
(
‘UserForgotPassword’
,
UserForgotPasswordView
。
as_view
(),
name
=
‘UserForgotPassword’
),
# 郵箱驗證路由地址
path
(
‘EmailVerifyRecord’
,
EmailVerifyRecordView
。
as_view
(),
name
=
‘EmailVerifyRecord’
),
# 郵箱驗證路由地址
re_path
(
“UserResetPassword/\?Username=(?P\w+)”
,
UserResetPasswordView
。
as_view
(),
name
=
“UserResetPassword”
),
# 使用者重置密碼
path
(
‘UserResetPassword’
,
UserResetPasswordView
。
as_view
(),
name
=
‘UserResetPassword’
),
]
前端渲染模板
admin_base.html
<!doctype html>
<
html
class
=
“no-js”
lang
=
“cn”
>
{% load static %}
<
head
>
<
meta
charset
=
“utf-8”
>
<
meta
http-equiv
=
“x-ua-compatible”
content
=
“ie=edge”
>
<
title
>
Mr資料楊的部落格使用者管理模組
title
>
<
meta
name
=
“description”
content
=
“”
>
<
meta
name
=
“viewport”
content
=
“width=device-width, initial-scale=1”
>
<
link
rel
=
“shortcut icon”
type
=
“image/x-icon”
href
=
“img/favicon。ico”
>
<
link
href
=
“https://fonts。googleapis。com/css?family=Open+Sans:300,300i,400,400i,700,700i,800”
rel
=
“stylesheet”
>
<
link
rel
=
“stylesheet”
href
=
“{% static ‘User/css/bootstrap。min。css’ %}”
>
<
link
rel
=
“stylesheet”
href
=
“{% static ‘User/css/font-awesome。min。css’ %}”
>
<
link
rel
=
“stylesheet”
href
=
“{% static ‘User/css/adminpro-custon-icon。css’ %}”
>
<
link
rel
=
“stylesheet”
href
=
“{% static ‘User/css/meanmenu。min。css’ %}”
>
<
link
rel
=
“stylesheet”
href
=
“{% static ‘User/css/jquery。mCustomScrollbar。min。css’ %}”
>
<
link
rel
=
“stylesheet”
href
=
“{% static ‘User/css/animate。css’ %}”
>
<
link
rel
=
“stylesheet”
href
=
“{% static ‘User/css/normalize。css’ %}”
>
<
link
rel
=
“stylesheet”
href
=
“{% static ‘User/css/form。css’ %}”
>
<
link
rel
=
“stylesheet”
href
=
“{% static ‘User/style。css’ %}”
>
<
link
rel
=
“stylesheet”
href
=
“{% static ‘User/css/responsive。css’ %}”
>
head
>
<
body
class
=
“darklayout”
>
{### 使用者功能載入模組 ###}
{% block user_function %}{% endblock %}
<
div
class
=
“footer-copyright-area”
>
<
div
class
=
“container-fluid”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-12”
>
<
div
class
=
“footer-copy-right”
>
<
p
>
Mr資料楊的部落格網站使用者管理系統
p
>
div
>
div
>
div
>
div
>
div
>
body
>
html
>
register.html
{% extends ‘User/user_function_admin。html’ %}
{% load staticfiles %}
{% block user_function %}
<
div
class
=
“wrapper-pro”
>
<
div
class
=
“breadcome-area mg-b-30 small-dn”
>
<
div
class
=
“container-fluid”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-12”
>
<
div
class
=
“breadcome-list shadow-reset”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-6”
>
<
div
class
=
“breadcome-heading”
>
<
h2
>
歡迎訪問使用,請註冊使用者會員
h2
>
div
>
div
>
div
>
div
>
div
>
div
>
div
>
div
>
<
div
class
=
“login-form-area mg-t-30 mg-b-15”
>
<
div
class
=
“container-fluid”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-3”
>
div
>
<
form
id
=
“adminpro-register-form”
class
=
“adminpro-form”
method
=
“post”
>
{% csrf_token %}
<
div
class
=
“col-lg-6”
>
<
div
class
=
“login-bg”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-12”
>
<
div
class
=
“logo”
>
<
a
href
=
“#”
>
<
img
src
=
“{% static ‘admin/img/logo/log。png’ %}”
alt
=
“”
/>
a
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-12”
>
<
div
class
=
“login-title”
>
<
h1
>
請填寫註冊資訊
h1
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-input-head”
>
<
p
>
使用者暱稱
p
>
div
>
div
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“login-input-area”
>
<
input
type
=
“text”
name
=
“nick_name”
/>
<
i
class
=
“fa fa-user login-user”
>
i
>
div
>
div
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-input-head”
>
<
p
>
使用者名稱
p
>
div
>
div
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“login-input-area”
>
<
input
type
=
“text”
name
=
“username”
/>
<
i
class
=
“fa fa-user login-user”
>
i
>
div
>
div
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-input-head”
>
<
p
>
電話
p
>
div
>
div
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“login-input-area”
>
<
input
type
=
“text”
name
=
“tel”
/>
<
i
class
=
“fa fa-phone login-user”
>
i
>
div
>
div
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-input-head”
>
<
p
>
電子郵箱
p
>
div
>
div
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“login-input-area”
>
<
input
type
=
“email”
name
=
“email”
/>
<
i
class
=
“fa fa-envelope login-user”
aria-hidden
=
“true”
>
i
>
div
>
div
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-input-head”
>
<
p
>
密碼
p
>
div
>
div
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“login-input-area”
>
<
input
type
=
“password”
name
=
“password”
/>
<
i
class
=
“fa fa-lock login-user”
>
i
>
div
>
div
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-input-head”
>
<
p
>
確認密碼
p
>
div
>
div
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“login-input-area”
>
<
input
type
=
“password”
name
=
“confarm_password”
/>
<
i
class
=
“fa fa-lock login-user”
>
i
>
div
>
div
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-input-head”
>
<
p
>
驗證碼
p
>
div
>
div
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“row”
>
<
div
class
=
“form-group {% if register_form。captcha。errors %} errorput{% endif %}”
>
{{ active_form。captcha }}
 ; ;
{{ register_form。captcha }}
div
>
<
div
class
=
“error btns”
style
=
“font-size:5px;color:white”
>
{% for key, error in register_form。errors。items %}
{{ error }}
{% endfor %}
div
>
<
p
style
=
“font-size:5px;color:white”
>
{{ msg }}
p
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
div
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“login-button-pro”
>
<
button
type
=
“submit”
class
=
“login-button login-button-lg”
>
註冊使用者
button
>
div
>
div
>
div
>
div
>
div
>
form
>
<
div
class
=
“col-lg-3”
>
div
>
div
>
div
>
div
>
div
>
{% endblock %}
forgot.html
{% extends ‘User/user_function_admin。html’ %}
{% load staticfiles %}
{% block user_function %}
<
div
class
=
“wrapper-pro”
>
<
div
class
=
“breadcome-area mg-b-30 small-dn”
>
<
div
class
=
“container-fluid”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-12”
>
<
div
class
=
“breadcome-list shadow-reset”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-6”
>
<
div
class
=
“breadcome-heading”
>
<
h2
>
使用者密碼找回
h2
>
div
>
div
>
div
>
div
>
div
>
div
>
div
>
div
>
<
div
class
=
“login-form-area mg-t-30 mg-b-40”
>
<
div
class
=
“container-fluid”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
div
>
<
form
id
=
“adminpro-form”
class
=
“adminpro-form”
method
=
“post”
>
{% csrf_token %}
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-bg”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-12”
>
<
div
class
=
“logo”
>
<
img
src
=
“{% static ‘admin/img/logo/log。png’ %}”
alt
=
“”
/>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-12”
>
<
div
class
=
“login-title”
>
<
h1
>
填寫註冊的郵箱和電話找回密碼
h1
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-input-head”
>
<
p
>
郵箱
p
>
div
>
div
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“login-input-area”
>
<
input
type
=
“text”
name
=
“email”
/>
<
i
class
=
“fa fa-envelope login-user”
aria-hidden
=
“true”
>
i
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-input-head”
>
<
p
>
電話
p
>
div
>
div
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“login-input-area”
>
<
input
type
=
“text”
name
=
“tel”
/>
<
i
class
=
“fa fa-phone login-user”
aria-hidden
=
“true”
>
i
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-input-head”
>
<
p
>
驗證碼
p
>
div
>
div
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“row”
>
<
div
class
=
“form-group {% if forgot_form。captcha。errors %} errorput{% endif %}”
>
{{ active_form。captcha }}
 ; ;
{{ forgot_form。captcha }}
div
>
<
div
class
=
“error btns”
style
=
“font-size:5px;color:white”
>
{% for key, error in forgot_form。errors。items %}
{{ error }}
{% endfor %}
div
>
<
p
style
=
“font-size:5px;color:white”
>
{{ msg }}
p
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
div
>
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-button-pro”
>
<
button
type
=
“submit”
class
=
“login-button login-button-lg”
>
找回密碼
button
>
div
>
div
>
div
>
div
>
div
>
form
>
<
div
class
=
“col-lg-4”
>
div
>
div
>
div
>
div
>
div
>
{% endblock %}
login.html
{% extends ‘User/user_function_admin。html’ %}
{% load staticfiles %}
{% block user_function %}
<
div
class
=
“wrapper-pro”
>
<
div
class
=
“breadcome-area mg-b-30 small-dn”
>
<
div
class
=
“container-fluid”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-12”
>
<
div
class
=
“breadcome-list shadow-reset”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-6”
>
<
div
class
=
“breadcome-heading”
>
<
h2
>
歡迎訪問使用,請登入使用更多功能
h2
>
div
>
div
>
div
>
div
>
div
>
div
>
div
>
div
>
<
div
class
=
“login-form-area mg-t-30 mg-b-40”
>
<
div
class
=
“container-fluid”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
div
>
<
form
id
=
“adminpro-form”
class
=
“adminpro-form”
method
=
“post”
>
{% csrf_token %}
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-bg”
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-12”
>
<
div
class
=
“logo”
>
<
img
src
=
“{% static ‘admin/img/logo/log。png’ %}”
alt
=
“”
/>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-12”
>
<
div
class
=
“login-title”
>
<
h1
>
填寫登入資訊
h1
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-input-head”
>
<
p
>
郵箱/電話
p
>
div
>
div
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“login-input-area”
>
<
input
type
=
“text”
name
=
“username”
/>
<
i
class
=
“fa fa-envelope login-user”
aria-hidden
=
“true”
>
i
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-input-head”
>
<
p
>
密碼
p
>
div
>
div
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“login-input-area”
>
<
input
type
=
“password”
name
=
“password”
/>
<
i
class
=
“fa fa-lock login-user”
>
i
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-12”
>
<
div
class
=
“forgot-password”
>
<
a
href
=
“#”
>
忘記密碼?
a
>
div
>
div
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
<
div
class
=
“login-input-head”
>
<
p
>
驗證碼
p
>
div
>
div
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“row”
>
<
div
class
=
“form-group {% if login_form。captcha。errors %} errorput{% endif %}”
>
{{ active_form。captcha }}
 ; ;
{{ login_form。captcha }}
div
>
<
div
class
=
“error btns”
style
=
“font-size:5px;color:white”
>
{% for key, error in login_form。errors。items %}
{{ error }}
{% endfor %}
div
>
<
p
style
=
“font-size:5px;color:white”
>
{{ msg }}
p
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-12”
>
<
div
class
=
“login-keep-me”
>
<
label
class
=
“checkbox”
>
<
input
type
=
“checkbox”
name
=
“remember”
checked
><
i
>
i
>
儲存登入資訊
label
>
div
>
div
>
div
>
<
div
class
=
“row”
>
<
div
class
=
“col-lg-4”
>
div
>
<
div
class
=
“col-lg-8”
>
<
div
class
=
“login-button-pro”
>
<
button
type
=
“submit”
class
=
“login-button login-button-lg”
>
登入
button
>
div
>
div
>
div
>
div
>
div
>
form
>
<
div
class
=
“col-lg-4”
>
div
>
div
>
div
>
div
>
div
>
{% endblock %}