django+xadmin在線教育平臺(九)

django admin介紹

上一章咱們進行了需求分析和數據庫設計。本章咱們來快速搭建一個可用的後臺管理系統。javascript

後臺管理系統特色:php

  • 權限管理
  • 少前端樣式。(樣式通常不是很看重),
  • 快速開發

django的後臺管理系統是一套智能的管理系統。
django的殺手鐗之一就是admin管理系統。css

admin在項目新建時就已經爲咱們生成好了。html

 
mark

Django的admin也是一個app,在咱們新建項目時就建立好了。
並且會自動在url中配置好了連接。前端

 
mark

訪問:http://127.0.0.1:8000/admin/java

能夠看到admin的登陸窗口。python

Django是不會自動生成admin的用戶的,須要咱們本身去命令生成。mysql

createsuperuser

點擊Tools 菜單下 Run manage.py Taskgit

createsuperuser
 
mark

輸入本身的用戶名密碼。github

報錯:

django.db.utils.DataError: (1406, "Data too long for column 'gender' at row 1") 

gender中female是6位。而咱們最大長度只有5.

 
mark

修改後

makemigrations users
migrate users

而後從新createsuperuser

使用本身定義的用戶名密碼能夠登進系統。

 
mark

默認是用戶名 + 密碼。後面會講到如何實現用戶名 或 郵箱和密碼登陸。

修改setting中對應語言,時區,以及數據庫寫入時間。

修改

# 語言改成中文 LANGUAGE_CODE = 'zh-hans' # 時區改成上海 TIME_ZONE = 'Asia/Shanghai' # 數據庫存儲使用時間,True時間會被存爲UTC的時間 USE_TZ = False 

點擊運行能夠看到以下圖被換成漢語的效果:

 
mark

注意: django 2.0.1 並不會看到漢化後的默認頁面。只有admin被漢化了。

組對應數據表: auth_group

在Django的admin中能夠把上章的表都註冊進來。對於表進行任意的增刪改查。

默認其實會把user也註冊進來的,可是由於咱們經過userProfile覆蓋了user。因此沒有顯示。

註冊UserProfile進來

users/admin.py:

# encoding: utf-8 # 由於同一個目錄,因此能夠直接.models from .models import UserProfile # 寫一個管理器:命名, model+Admin class UserProfileAdmin(admin.ModelAdmin): pass # 將UserProfile註冊進咱們的admin中, 併爲它選擇管理器 admin.site.register(UserProfile,UserProfileAdmin) 
 
mark

能夠看到咱們的用戶信息就註冊進來了。

USERS 是用戶所在表名稱。

 
mark

進入頁面能夠看到Django爲咱們把每一個不一樣類型的字段生成了不一樣的前端樣式。

 
mark

Django會自動幫咱們把密碼加密,並且不能反解。單向性。

若是出現錯誤, 多是initial文件在咱們拖入apps時路徑被改變。以後咱們添加了環境變量, 前面再加上apps就會報錯。

這時把initial.py 中路徑進行修改。

錯誤2:

新增用戶信息提示:
Cannot add or update a child row: a foreign key constraint fails (1452, 'Cannot add or update a child row: a foreign key constraint fails `mxonline`.`django_admin_log`, CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`))') 

解決方案1: 不用解決,以後換Xadmin就行了。

解決方案2: 在setting的databases中添加如下代碼取消外鍵檢查

DATABASES = {
    'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mxonline2', 'USER': 'root', 'PASSWORD': '你的密碼', 'HOST':'127.0.0.1', 'OPTIONS': { "init_command": "SET foreign_key_checks=0;", } }, } 
 
mark

實驗成功爲了避免影響後面,把options刪除

本小節結束對應commit:

admin中添加管理器&註冊。時區,語言,utc(False).數據庫中選項參數。female的長度修改, createsuperuser.對應5-1

xadmin的安裝

一套基於admin, 比admin更強大的系統。

  1. 經過pip安裝
pip install xadmin

Python3 & Django2.0.1安裝官方適配Django2.0的包

pip install git+git://github.com/sshwsfc/xadmin.git@django2 

xadmin能夠把咱們的後臺作的很強大,可擴展。

 
mark

能夠看到它同時下載了不少其餘依賴包。

註冊Xadmin 與 crispy-forms

Mxonline2/settings.py的INSTALLED_APPS中

'xadmin', 'crispy_forms' 

而後把urls中默認admin指向Xadmin

# 導入x admin,替換admin import xadmin urlpatterns = [ url(r'^xadmin/', xadmin.site.urls), ] 

Python3 Django2.0.1 的url的配置中

path('xadmin/', xadmin.site.urls), 

注意:Django 2.0.1中不須要加r也不須要加^

將咱們原來寫的user/admin.py中代碼註釋掉。

此時直接運行項目會報錯,由於咱們Xadmin的默認數據表並無migarte

ProgrammingError: (1146, "Table 'mxonline2.xadmin_usersettings' doesn't exist") [09/Jan/2018 06:40:27] "GET /xadmin/ HTTP/1.1" 500 150414 

點擊Tools 菜單下 Run manage.py Task

makemigrations
migrate
 
mark

能夠看到已經被應用成功。

前往Navicat進行驗證。

 
mark

能夠看到新增的表。

Xadmin的後臺採用的是bootstrap。

 
mark

後面咱們會介紹如何製做插件

源碼安裝:

github: https://github.com/sshwsfc/xadmin

下載或git clone將源碼下載到本地。

 
mark

解壓後將Xadmin文件夾複製到咱們的項目中。

 
mark

Python3版本源碼安裝:與url配置不一樣

git clone -b django2 https://github.com/sshwsfc/xadmin.git 

其他操做同樣。

新建extra_apps,並在setting中註冊地址

新建new package: extra_apps

使用該目錄存放咱們的第三方插件,將Xadmin移入。
右鍵mark爲SourceRoot, 可是這時候cmd下回報錯。

因此在setting.py中加入。

sys.path.insert(0,os.path.join(BASE_DIR, 'extra_apps')) 

由於咱們的source目錄已經有Xadmin了,就不會再去系統環境中找了。這時候卸載咱們的Xadmin。

workon mxonline2
pip uninstall xadmin

可是他的依賴包咱們還須要,因此只須要卸載Xadmin。此時咱們運行會報錯

from future.utils import iteritems ImportError: No module named future.utils 

安裝必要的包:

pip install future
pip install six
pip install httplib2
pip install django-import-export 

此時又能夠成功運行了

 
mark

日誌記錄:後臺管理人員作的操做都會生成一條記錄。

源碼安裝優勢:

  • xadmin新特性
  • 對於源碼進行本身的修改。

本小節結束對應commit:

Xadmin的安裝與源碼安裝,配置setting中extra_apps. 對應5-2

users app 的model註冊

遺留問題: django2.0.1使用xadmin時。如驗證碼等帶dateTimefield區域出錯。

xadmin/widgets.py

 
mark
input_html = [ht for ht in super(AdminSplitDateTime, self).render( name, value, attrs).split('/><') if ht != ''] if (len(input_html) > 1): input_html[0] = input_html[0] + "/>" input_html[1] = "<" + input_html[1] 
 
mark

此時能夠看到已經運行正常

真正開始

Xadmin是基於Django的admin來開發的,因此Xadmin也繼承了許多admin的用法。

  • 好比: models的註冊。

UserProfile已經被自動註冊進去了,咱們從驗證碼開始註冊。

咱們須要新建一個adminx.py文件,Xadmin會自動搜尋這種命名的文件。

新建py文件的初始化模板

 
mark

新建users/adminx.py:

# encoding: utf-8 __author__ = 'mtianyan' __date__ = '2018/1/9 0009 08:02' import xadmin from .models import EmailVerifyRecord # 建立admin的管理類,這裏再也不是繼承admin,而是繼承object class EmailVerifyRecordAdmin(object): pass xadmin.site.register(EmailVerifyRecord, EmailVerifyRecordAdmin) 
 
mark

能夠看到這時候訪問已經有郵箱驗證碼了。

郵箱驗證碼這幾個字就是咱們代碼中Meta中verbose_name定義的:

class Meta: verbose_name = "郵箱驗證碼" verbose_name_plural = verbose_name 

verbose_name_pluralverbose_name的複數形式。

字段的verbose_name會直接顯示在後臺。sendtypesendtime沒有設置因此直接顯示了英文。

 
mark

能夠看到咱們添加驗證碼成功。注意:上節版本中咱們進行了: makemigaration & migrate。
可是它是pip安裝的Xadmin的數據表生成。咱們卸載以後,源碼安裝須要從新運行進行數據遷移。(django須要經過app文件夾下的init文件來記錄表的更改記錄,pip的都卸了,因此就無法找到了)

會報錯:

Xadmin_log不存在錯誤。只須要運行這兩條命令便可。

 
mark

解決後臺部分英文顯示

所有models中字段自行添加verbose_name

 
mark

這裏就不貼出來了,自行檢查都加上(沒寫出的請自行修改所有加上verbose_name)。

解決EmailVerifyRecord object顯示

所有(沒寫出的請自行修改)model,py2:重載__unicode py3:重載__str__

# 重載Unicode方法使後臺再也不直接顯示object def __unicode__(self): return '{0}({1})'.format(self.code,self.email) 

上面代碼是python的自身基礎語法。

 
mark
 
mark

配置顯示列

 
mark

users/adminx.py的管理器中設置list_display:

# 建立admin的管理類,這裏再也不是繼承admin,而是繼承object class EmailVerifyRecordAdmin(object): # 配置後臺咱們須要顯示的列 list_display = ['code', 'email','send_type', 'send_time'] 

list_display可使用列表或元祖,建議使用列表。不然元組只有一個元素,忘記加逗號就會報錯。

 
mark

選擇框的生成是由於咱們加上了choices

配置搜索searchfield

users/adminx.py的管理器中EmailVerifyRecordAdmin添加

# 配置搜索字段,不作時間搜索 search_fields = ['code', 'email','send_type'] 
 
mark

再添加一條數據驗證搜索功能

 
mark
 
mark

xadmin導出csv中文亂碼解決

 
mark

charset=utf-8 改成charset=gbk

xadmin導出xml報錯

TypeError at /xadmin/users/emailverifyrecord/ unicode argument expected, got 'str' 

io.StringIO這個庫新版本的python3直接往這個庫中加入了一些新的內容,使得該庫在Python2.7中較爲混亂。

 
mark

將StringIo變爲BytesIO

經過時間篩選字段。

users/adminx.py的管理器中EmailVerifyRecordAdmin添加

# 配置篩選字段 list_filter = ['code', 'email','send_type', 'send_time'] 
 
mark

Django的admin, Xadmin和其餘系統區別

不像php等其餘語言是一個功能模塊一個功能設計的。
Django是對於每張表增刪改查的管理器,咱們能夠在增刪改爲的基礎上加上咱們本身的後臺邏輯。
所以某種程度能夠說他是不依賴於具體業務的。無論啥系統後臺都是由表組成。

不依賴於後臺邏輯,又能夠加上邏輯。

user/models的註冊

users/adminx.py中

# 建立banner的管理類 class BannerAdmin(object): list_display = ['title', 'image', 'url','index', 'add_time'] search_fields = ['title', 'image', 'url','index'] list_filter = ['title', 'image', 'url','index', 'add_time'] 
# 將model與admin管理器進行關聯註冊 xadmin.site.register(Banner, BannerAdmin) 

此時後臺頁面。

 
mark

能夠自行測試輪播圖是否能夠新建成功。

本小節結束對應commit:

usersmodels三張表註冊進xadmin, 配置搜索過濾展現字段,修復xadmin導出xml錯誤,導出csv亂碼,Unicode重載。對應5-3

py3(django2.0.1):

usersmodels三張表註冊進xadmin, 配置搜索過濾展現字段,修復xadmin導出csv亂碼,修復django2.0.1的indexError, str重載。對應5-3

原文學習來自簡書,做者:天涯明月笙連接:https://www.jianshu.com/p/16d4dd0093d7

相關文章
相關標籤/搜索