二、后臺管理系統(tǒng)的設(shè)計

添加超級用戶

Django有一套自帶的后臺管理系統(tǒng), 比如我們可以直接建立超級用戶:

python3 manage.py createsuperuser

Django的后臺系統(tǒng)默認是英文的, 如果我們想改成中文的, 可以在settings.py里配置:

#settings.py

...
#中文
LANGUAGE_CODE = 'zh-hans'
#時區(qū)
TIME_ZONE = 'Asia/Shanghai'
#使用本地時間
USE_TZ = False

后臺頁面管理

現(xiàn)在,我們可以通過runserver命令進入后臺管理系統(tǒng),目前只能看到用戶和用戶組兩個數(shù)據(jù)表。除此之外,我們可以將某些Django app中定義的models表添加到后臺進行管理,具體操作是在對應(yīng)APP目錄下的admin.py中添加信息,比如我們想把blogs這個app中設(shè)計的Article這個model注冊到后臺, 我們需要在blogs/admin.py中編寫如下代碼:

#blogs/admin.py
from django.contrib import admin
from .models import Article

class ArticleAdmin(admin.ModelAdmin):
    pass

admin.site.register(Article,ArticleAdmin)

這樣我們的后臺頁面就多了一張數(shù)據(jù)表。

用戶信息表的擴展

Django給我們設(shè)計了一個默認的后臺用戶信息表的Model, 其表結(jié)構(gòu)我們可以在后臺數(shù)據(jù)庫中的auth_user表看到,建表語句如下:

CREATE TABLE `auth_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT, #主鍵
  `password` varchar(128) NOT NULL, #密碼
  `last_login` datetime(6) DEFAULT NULL, #Django自動記錄最后登錄時間
  `is_superuser` tinyint(1) NOT NULL, #是否是超級用戶
  `username` varchar(150) NOT NULL, #用戶名
  `first_name` varchar(150) NOT NULL, #名
  `last_name` varchar(150) NOT NULL, #姓
  `email` varchar(254) NOT NULL, #郵箱
  `is_staff` tinyint(1) NOT NULL, #是否是員工
  `is_active` tinyint(1) NOT NULL, #是否激活
  `date_joined` datetime(6) NOT NULL, #用戶注冊時間
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

如果我們覺得這些字段仍然不滿足需求,我們可以基于此表自定義一個用戶信息擴展表。

創(chuàng)建Users的app

首先,我們需要在項目中添加一個用戶系統(tǒng)的app, 用于處理users的事務(wù):

python3 manage.py startapp users<app的名稱>

注意在settings.py中配置新增的app:

#users/settings.py
...
INSTALLED_APPS = [
    ...
    "users"
]
...
設(shè)計Users Model

接下來, 我們需要設(shè)計users app的model.py文件中添加數(shù)據(jù)模型信息。Django給我們提供了一個AbstractUser的抽象類,該類擁有auth_user表中所有字段,使得我們可以通過繼承該類,在已有的用戶信息字段基礎(chǔ)上擴展出新的用戶信息表:

#users/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser


class UserProfile(AbstractUser):
    nick_name = models.CharField(max_length=50, verbose_name='昵稱',default="")
    birday = models.DateField(verbose_name='生日',null=True,blank=True)
    gender = models.CharField(max_length=10,choices=(("male","男"),("female","女")),default="female")
    address = models.CharField(max_length=100,default="")
    mobile = models.CharField(max_length=11, null=True, blank = True)
    image = models.ImageField(max_length=100,upload_to="image/%Y/%m",default="image/default.png")
    
    class Meta:
        verbose_name = "用戶信息"
        verbose_name_plural = verbose_name
        
        
    def __unicode__(self):
        return self.username

另外,我們需要在settings.py中添加下面這行代碼,其作用是為Django指定一個新的用戶數(shù)據(jù)表來替代老的auth_user表:

#settings.py
...
AUTH_USER_MODEL = "users.UserProfile"
...
同步用戶數(shù)據(jù)信息

最后,我們需要執(zhí)行以下兩行命令,將新的后臺用戶信息同步到數(shù)據(jù)庫中:

python3 manage.py makemigrations
python3 manage.py migrate

注意:如果由于之前已經(jīng)存在的admin的表對項目默認的auth_user表有依賴,導致在同步中報錯,可以先清除掉原來的auth_user表,再執(zhí)行這兩行命令(反正現(xiàn)在沒有業(yè)務(wù)數(shù)據(jù))。

后臺用戶的登錄校驗

Dango自帶的一個用戶驗證方法authenticate,默認通過username和password進行驗證,如果驗證成功,該方法將返回一個user對象,否則返回None。此外,Django允許我們使用自定義驗證方式,如下所示,我們通過繼承類ModelBackend來重寫authenticate方法,用Q實現(xiàn)或邏輯:

#users/views.py
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 .models import UserProfile


class CustomBackend(ModelBackend):
    def authenticate(self,username=None,password=None,**kwargs):
        try:
            user = UserProfile.objects.get(Q(username=username)|Q(email=username))
            if user.check_password(password):
                return user
        except Exception as e:
            return None
    def user_login(request):
        if request.method == 'POST':
            user_name = request.POST.get('username',"")
            pass_word =  request.POST.get('password',"")
            user = authenticate(username=user_name,password=pass_word)
            if user is not None:
                login(request,user)
                return render(request,"login.html")
            else:
                return render(request,'login.html',{"msg":"用戶名或密碼錯誤!"})
        elif request.method == 'GET':
            return render(request,'login.html',{})
#urls.py
...
from users.views import user_login

urlpatterns = [
    ...
    url('^login/$',user_login,name='login')
]

如果我們選擇自定義后臺用戶校驗邏輯,則需要在settings.py中指定我們使用的校驗類:

#settings.py
...
AUTHENTICATION_BACKENDS = (
    'users.views.CustomBackend',
)

views.py中還用到了login,這個方法將通過request記錄下用戶的地址,通過session和cookies記錄用戶的狀態(tài)。Django的前端可以通過{% request.user.is_authenticated %}判斷用戶是否驗證。

DjangoUeditor

為了給我們的文章添加一個富文本編輯器, 我們使用DjangoUeditor, 我們在官網(wǎng)或者git上下載下對應(yīng)版本的DjangoUeditor后, 在項目目錄下新建一個文件夾extra_apps, 將DjangoUeditor文件夾放入該目錄下, 在settings.py中進行設(shè)置:

#settings.py

...
sys.path.insert(0,os.path.join(BASE_DIR,'extra_apps'))
INSTALLED_APPS = [
    ...
    'DjangoUeditor',
]

另外在urls.py中也需要進行設(shè)置:

#urls.py
...

urlpatterns = [
    ...
    url(r'^ueditor/',include('DjangoUeditor.urls')),
]

最后, 當需要使用對應(yīng)的models時需要使用以下設(shè)置:

#models.py
...
from DjangoUeditor.models import UEditorField

class XXmodels(models.Model):
    ...
    content = UEditorField(default='', blank=True, width=1000, imagePath='uploads/blog/images/',filePath='uploads/blog/files/', verbose_name='文章內(nèi)容')

引入強大的Xadmin

Xadmin是基于Django的admin擴展我們的后臺功能的管理系統(tǒng),
安裝方式如下:

pip install xadmin

安裝成功后, 我們需要在settings.py中注冊兩個APP:

#settings.py
...
INSTALLED_APPS = [
    ...
    'xadmin',
    'crispy_forms'
]

之后, 我們需要在urls.py中修改admin的映射關(guān)系:

#urls.py
from django.conf.urls import url
from django.contrib import admin
import xadmin

urlpatterns = [
    url(r'^xadmin/',xadmin.site.urls),
]

另外, users/admin.py中也不能用默認的admin的注冊方式了:

#users/admin.py
from django.contrib import admin

實際上, 我們需要在每個app下新建一個adminx.py文件:

#users/adminx.py

import xadmin
from .models import EmailVerifyRecord

class EmailVerifyRecordAdmin(object):
    #后臺展示哪些字段, 可以不設(shè)置
    list_display = ['code','email']
    #后臺在哪些字段中進行搜索
    search_fields = ['']

xadmin.site.register(EmailVerifyRecord,EmailVerifyRecordAdmin)

之后使用makemigrations和migrate同步xadmin的表結(jié)構(gòu), 之后重啟系統(tǒng)就可以。

Xadmin的一些設(shè)置

xadmin有一些用戶可以自定義的設(shè)置。

#users/adminx.py
...
from xadmin import views

#使用主題功能,變更系統(tǒng)配色
class BaseSetting(object):
    enable_themes = True
    use_bootswatch = True
    
xadmin.site.register(views.BaseAdminView,BaseSetting)


class GlobalSettings(object):
    #修改角標
    site_title = "終極奧義"
    site_footer = "眼君數(shù)據(jù)"
    #左側(cè)菜單欄收縮
    menu_style = "accordion"
    
xadmin.site.register(views.CommAdminView,GlobalSettings)

每一個APP都有一個apps.py文件, xadmin可以設(shè)置系統(tǒng)中APP的名稱:

#users/apps.py
from django.apps import AppConfig
class UserConfig(AppConfig):
    name = 'users'
    verbose_name = '用戶信息'
#users/__init__.py
default_app_config = "users.apps.UserConfig"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容