上一章咱們進行了需求分析和數據庫設計。本章咱們來快速搭建一個可用的後臺管理系統。javascript
後臺管理系統特色:php
django的後臺管理系統是一套智能的管理系統。
django的殺手鐗之一就是admin管理系統。css
admin在項目新建時就已經爲咱們生成好了。html
Django的admin也是一個app,在咱們新建項目時就建立好了。
並且會自動在url中配置好了連接。前端
訪問:http://127.0.0.1:8000/admin/java
能夠看到admin的登陸窗口。python
Django是不會自動生成admin的用戶的,須要咱們本身去命令生成。mysql
點擊Tools 菜單下 Run manage.py Task
git
createsuperuser
輸入本身的用戶名密碼。github
報錯:
django.db.utils.DataError: (1406, "Data too long for column 'gender' at row 1")
gender中female是6位。而咱們最大長度只有5.
修改後
makemigrations users migrate users
而後從新createsuperuser
使用本身定義的用戶名密碼能夠登進系統。
默認是用戶名 + 密碼。後面會講到如何實現用戶名 或 郵箱和密碼登陸。
修改
# 語言改成中文 LANGUAGE_CODE = 'zh-hans' # 時區改成上海 TIME_ZONE = 'Asia/Shanghai' # 數據庫存儲使用時間,True時間會被存爲UTC的時間 USE_TZ = False
點擊運行能夠看到以下圖被換成漢語的效果:
注意: django 2.0.1 並不會看到漢化後的默認頁面。只有admin被漢化了。
組對應數據表: auth_group
在Django的admin中能夠把上章的表都註冊進來。對於表進行任意的增刪改查。
默認其實會把user也註冊進來的,可是由於咱們經過userProfile覆蓋了user。因此沒有顯示。
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)
能夠看到咱們的用戶信息就註冊進來了。
USERS
是用戶所在表名稱。
進入頁面能夠看到Django爲咱們把每一個不一樣類型的字段生成了不一樣的前端樣式。
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;", } }, }
實驗成功爲了避免影響後面,把options刪除
本小節結束對應commit:
admin中添加管理器&註冊。時區,語言,utc(False).數據庫中選項參數。female的長度修改, createsuperuser.對應5-1
一套基於admin, 比admin更強大的系統。
pip install xadmin
pip install git+git://github.com/sshwsfc/xadmin.git@django2
xadmin能夠把咱們的後臺作的很強大,可擴展。
能夠看到它同時下載了不少其餘依賴包。
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
能夠看到已經被應用成功。
前往Navicat進行驗證。
能夠看到新增的表。
Xadmin的後臺採用的是bootstrap。
後面咱們會介紹如何製做插件
github: https://github.com/sshwsfc/xadmin
下載或git clone
將源碼下載到本地。
解壓後將Xadmin文件夾複製到咱們的項目中。
git clone -b django2 https://github.com/sshwsfc/xadmin.git
其他操做同樣。
新建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
此時又能夠成功運行了
日誌記錄:後臺管理人員作的操做都會生成一條記錄。
源碼安裝優勢:
本小節結束對應commit:
Xadmin的安裝與源碼安裝,配置setting中extra_apps. 對應5-2
xadmin/widgets.py
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]
此時能夠看到已經運行正常
Xadmin是基於Django的admin來開發的,因此Xadmin也繼承了許多admin的用法。
UserProfile已經被自動註冊進去了,咱們從驗證碼開始註冊。
咱們須要新建一個adminx.py
文件,Xadmin會自動搜尋這種命名的文件。
新建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)
能夠看到這時候訪問已經有郵箱驗證碼了。
郵箱驗證碼這幾個字就是咱們代碼中Meta中verbose_name定義的:
class Meta: verbose_name = "郵箱驗證碼" verbose_name_plural = verbose_name
verbose_name_plural
是verbose_name
的複數形式。
字段的verbose_name會直接顯示在後臺。sendtype
和sendtime
沒有設置因此直接顯示了英文。
能夠看到咱們添加驗證碼成功。注意:上節版本中咱們進行了: makemigaration & migrate。
可是它是pip安裝的Xadmin的數據表生成。咱們卸載以後,源碼安裝須要從新運行進行數據遷移。(django須要經過app文件夾下的init文件來記錄表的更改記錄,pip的都卸了,因此就無法找到了)
會報錯:
Xadmin_log不存在錯誤。只須要運行這兩條命令便可。
所有models中字段自行添加verbose_name
這裏就不貼出來了,自行檢查都加上(沒寫出的請自行修改所有加上verbose_name)。
所有(沒寫出的請自行修改)model,py2:重載
__unicode
py3:重載__str__
# 重載Unicode方法使後臺再也不直接顯示object def __unicode__(self): return '{0}({1})'.format(self.code,self.email)
上面代碼是python的自身基礎語法。
users/adminx.py的管理器中設置list_display:
# 建立admin的管理類,這裏再也不是繼承admin,而是繼承object class EmailVerifyRecordAdmin(object): # 配置後臺咱們須要顯示的列 list_display = ['code', 'email','send_type', 'send_time']
list_display可使用列表或元祖,建議使用列表。不然元組只有一個元素,忘記加逗號就會報錯。
選擇框的生成是由於咱們加上了choices
users/adminx.py的管理器中EmailVerifyRecordAdmin添加
# 配置搜索字段,不作時間搜索 search_fields = ['code', 'email','send_type']
再添加一條數據驗證搜索功能
將
charset=utf-8
改成charset=gbk
TypeError at /xadmin/users/emailverifyrecord/ unicode argument expected, got 'str'
io.StringIO這個庫新版本的python3直接往這個庫中加入了一些新的內容,使得該庫在Python2.7中較爲混亂。
將StringIo變爲BytesIO
users/adminx.py的管理器中EmailVerifyRecordAdmin添加
# 配置篩選字段 list_filter = ['code', 'email','send_type', 'send_time']
不像php等其餘語言是一個功能模塊一個功能設計的。
Django是對於每張表增刪改查的管理器,咱們能夠在增刪改爲的基礎上加上咱們本身的後臺邏輯。
所以某種程度能夠說他是不依賴於具體業務的。無論啥系統後臺都是由表組成。
不依賴於後臺邏輯,又能夠加上邏輯。
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)
此時後臺頁面。
能夠自行測試輪播圖是否能夠新建成功。
本小節結束對應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