Django基礎(19): Django Admin管理後臺詳解(上)

2021-03-02 Python Web與Django開發

對於習慣了自己動手編寫後臺的小編我而言,Django自帶的admin管理後臺就像諸葛亮的媳婦黃月英,擁有和諸葛亮一樣的才華,啥都行,只是不漂亮。小編我一開始對django自帶的admin其實內心是拒絕的,所以一直拖到今天才寫專文介紹Django的admin。在今天來看,這是小編我本不該犯的錯誤,所以也建議大家千萬不要拒絕使用Django的admin,而是應該學習更好地使用django的admin。Django自帶的admin是快速開發管理後臺的一把利劍,可以大大加快開發速度,也是Django的一個主要優點。今天我們就來看看Django admin的強大之處以及如何配置使用它。

為什麼要使用Django Admin


使用Django Admin可以快速對資料庫的各個數據表進行增刪查改。一行代碼即可增加對一個模型(數據表)的增刪查改。試想如果你要自己手動編寫後臺對一個模型進行增刪查改,你一般需要4個urls, 4個視圖函數或通用視圖和4個模板。當一個項目比較大包含多個app時,而每個app又包含多個模型(數據表)時, 那麼編寫和維護整個項目管理後臺的工作量可想而知。Django Admin所做就是將所有需要管理的模型(數據表)集中在一個平臺,你不僅可以選擇性地管理模型(數據表), 你還可以快速訂製數據條目查詢,過濾和搜索條件。

創建超級用戶superuser

使用django admin的第一步是創建超級用戶(superuser)。進入你的項目文件夾, 使用如下命名,輸入用戶名和密碼即可創建管理員。

$ python manage.py createsuperuser 

此時你訪問http://127.0.0.1:8000/admin/, 你就可以看到登錄界面了。


註冊模型(數據表)

假設你有一個叫blog的APP, 裡面包含了一個叫Article(文章)的模型, 你想對文章進行管理, 你只需找到blgo的admin.py,使用admin.site.register方法註冊Article模型。代碼如下所示:

#blog/admin.py

from django.contrib import admin
from .models import Article

# Register your models here.
admin.site.register(Article)

此時你登錄後看到Article數據表默認是這樣的,點擊標題即可對文章進行修改。只有Title欄位被顯示,太簡單。沒有顯示作者,沒有顯示發布日期,也沒有分頁,沒有過濾條件。


自定義數據表顯示選項

我們需要自定義數據表中哪些欄位可以顯示,哪些欄位可以編輯,並對數據表中的條目進行排序,同時定義過濾選項。Django的ModelAdmin自帶的list_display, list_filter, list_per_page, list_editable, date_hierarchy和ordering選項可以輕鬆幫我們做到。

要自定義數據表顯示欄位,我們只需對上述代碼做出如下改進。我們先定義ArticleAdmin類,然後使用admin.site.register(Article, ArticleAdmin)方法即可。

#blog/admin.py

from django.contrib import admin
from .models import Article,

# Register your models here.


class ArticleAdmin(admin.ModelAdmin):

   '''設置列表可顯示的欄位'''
   list_display = ('title', 'author',  'status', 'mod_date',)

   '''設置過濾選項'''
   list_filter = ('status', 'pub_date', )

   '''每頁顯示條目數'''
   list_per_page = 5

   '''設置可編輯欄位'''
   list_editable = ('status',)

   '''按日期月份篩選'''
   date_hierarchy = 'pub_date'

   '''按發布日期排序'''
   ordering = ('-mod_date',)

admin.site.register(Article, ArticleAdmin)

新的展示效果如下,是不是好多了? 試想下, 如果你要手動編寫代碼實現同樣的功能,你需要多編寫多少代碼?

另外兩個常用選項是 list_display_links和search_fields。前者設置帶連結的欄位,比如本例中帶連結的欄位為('title'), 後期設置可以搜索的欄位,如('title', 'body'),方便快速查詢需要修改的數據表條目。注意: list_display不能用在多對多欄位上哦。

單對多關係的選擇之raw_id_fields選項


假設我們有一個Category模型如下所示, 其有一個父類(ForeignKey),因為一個父類可能有多個子類。

class Category(models.Model):
   """文章分類"""
   name = models.CharField('分類名', max_length=30, unique=True)
   slug = models.SlugField('slug', max_length=40)
   parent_category = models.ForeignKey('self', verbose_name="父級分類", blank=True, null=True, on_delete=models.CASCADE)

我們現在把Category模型添加如admin,由於我們需要根據類別名(name)生成slug,我們所以還使用了prepopulated_fields選項。

#blog/admin.py

class CategoryAdmin(admin.ModelAdmin):
   prepopulated_fields = {'slug': ('name',)}

admin.site.register(Category, CategoryAdmin)

效果圖如下左圖所示。由於Django admin默認的單對多關係的選擇器是下拉菜單,假設ForeignKey非常的多,那麼下拉菜單將非常長,不便於用戶選擇。一個更好的方法是對ForeignKey使用raw_id_fields選項(如右圖所示)。

改進過的代碼如下所示,我們將看到下來菜單變成了放大鏡。

class CategoryAdmin(admin.ModelAdmin):
   prepopulated_fields = {'slug': ('name',)}
   raw_id_fields = ("parent_category", )

admin.site.register(Category, CategoryAdmin)

多對多關係的選擇之filter_horizontal選項

由於Django admin默認的多對多關係(ManyToMany)選擇器是複選框,非常的不好用。一個更好的方法是使用filter_horizontal或filter_vertical選項,如下圖所示:


顯示多個數據表數據在同一頁面上之InlineModelAdmin類

一個類別包含多篇文章,假設我們希望在查看編輯某個類別信息時,一同顯示並編輯同屬該類別下的所有文章信息,我們可以定義先定義ArticleInline類,然後把其附在CategoryAdmin裡。這樣我們就可以實現在同一頁面上編輯類別和所屬文章信息了,是不是很帥?

#blog/admin.py

from django.contrib import admin
from .models import Article, Category, Tag

class ArticleInline(admin.TabularInline):
   model = Article
   '''設置列表可顯示的欄位'''
   fields = ('title', 'author',  'status', 'mod_date',)


class CategoryAdmin(admin.ModelAdmin):
   prepopulated_fields = {'slug': ('name',)}
   raw_id_fields = ("parent_category", )
   inlines = [ArticleInline, ]

admin.site.register(Category, CategoryAdmin)

展示效果如下所示。試想下,你想手動編寫同樣代碼又要花多長時間?估計使用Mixins和Formsets早就讓你心煩意亂了吧。

Django提供了兩個InlineModelAdmin的子類:TabularInline和StackedInline,區別在於使用的模板, 一個橫著,一個豎著,選項是一樣的。InlineModelAdmin和ModelAdmin共同的常用options有:

form
fieldsets
fields
exclude
filter_horizontal
filter_vertical
ordering
prepopulated_fields
get_queryset()
radio_fields
readonly_fields
raw_id_fields

額外增加的options有:

InlineModelAdmin.model
inline使用的model,必需。

InlineModelAdmin.fk_name
model的name,當有多個外鍵時使用。

InlineModelAdmin.formset
預設BaseInlineFormSet。

InlineModelAdmin.form
預設ModelForm。當創建formset時傳遞給inlineformset_factory()。

InlineModelAdmin.extra
inline的額外數目。

InlineModelAdmin.get_extra()也返回inline的額外數目。

InlineModelAdmin.max_num
可展示得最大數目。

InlineModelAdmin.get_max_num()也返回此數字。

InlineModelAdmin.min_num
可展示的最小數目。

InlineModelAdmin.get_min_num()也返回此數目。

InlineModelAdmin.raw_id_fields

使用InlineModelAdmin一定要注意以下幾點哦。


修改Admin的標題Title(標題)和Header(頭部)

你是否早已厭倦了Django Admin模板裡的Django Administration這句話? 要修改這句話也非常簡單,在你的blog/admin.py裡加入下面兩句話即可,無需修改什麼模板。

#blog/admin.py


admin.site.site_header = 'Blog Administration'
admin.site.site_header = 'Blog Administration'

展示效果如下:

小結

本文詳細總結了如何使用Django自帶的admin快速開發管理後臺,設置數據表顯示選項,如何處理單對多和多對多關係的選擇, 如何在同一頁面上顯示多個數據表,以及修改admin的標題。下文我們將介紹admin後臺save方法的重寫及其它高級知識,歡迎關注我們的微信。

大江狗

2018.10.29

相關焦點

  • Django搭建個人博客:創建APP功能模塊
    可以將不同功能的模塊放在不同的app中, 方便管理以及調用。app就是項目的基石,因此開發博客的第一步就是創建新的app,用來實現跟文章相關的功能模塊。(專業一點就是在django 的配置文件中註冊這個應用。)
  • 【Django】RBAC權限管理系統模塊-理解
    >PART2 關於字節跳動一面顧名思義,在系統中可以靈活的劃分角色組,可以根據功能特性來劃分:- 比如設置系統管理員角色,綁定系統所有菜單,該角色享有系統全部管理功能;- 也可以根據工作職能來劃分角色,比如設置行政管理角色,綁定流程管理功能;- 權限的劃分可以細緻到 數據的瀏覽、新建、刪除、修改等操作行為 - 用戶可以關聯多個角色組
  • 「Django教程」第07天:上傳圖片/顯示圖片
    Django處理文件上傳時,文件最終會位於:attr:request.FILES <django.http.HttpRequest.FILES> 其實用上傳的地方很多,比如說用戶頭像啊,產品圖片,分享的照片啊等等,總的來說還是蠻重要的。本文章主要介紹文件是如何存儲在硬碟和內存中的,以及如何定製默認行為。
  • 如何使用Visual Studio創建Django項目
    Studiopython環境技術Djangopython一般情況下,我們使用pycharm工具創建python項目,還可以新建django
  • 動手練一練,做一個響應式的後臺管理面板
    作為一名前端開發者,我們或多或少都會接觸後臺管理系統的製作,你是否會親自純手工製作做還是從網上找源碼改一個呢?
  • PageAdmin Cms網站管理系統密碼複雜程度設置
    現在信息安全這塊管理越來越嚴格,很多重要的網站強制要求等保驗證,政府網站必須過三級等保,國企單位,學校網站要求過二級等保,所以在選擇cms的時候也會很注意cms系統的安全性,國內很多cms建站系統,比如大家熟悉的dede、phpcms等都過不了等級保護,就是因為漏洞或安全問題,之前我們公司做的幾個網站也是因為安全問題,要求從dede
  • 25 個精美的後臺管理界面模板和布局
    任何系統都會有一個管理後臺,好看的管理後臺看起來賞心悅目,管理的時候心情也舒暢,本文給大家推薦 25 個製作精美的後臺管理界面的模板和布局,你值得擁有。
  • 中後臺管理框架實戰!Near-Admin(介紹篇)
    廢話不多說,本期給大家帶來的是一個船新的東西,是作者本人近期重構並開源的一個中後臺前端開發框架,雖然這個公眾號前期關注的粉絲大部分為後端開發,但是不用擔心,掌握這個高效率的中後臺前端開發框架,能讓你非常快速的實現一個後臺管理系統,即使後端開發人員也能輕鬆上手,一起來看看吧。
  • 使用Python和Django進行Web開發的20個優點
    現在,您可以將精力集中在用戶界面上。使用Django的網站Django易於構建模板,或使用已經內置的模板語言,可以輕鬆構建可供部署的應用程式。毫不奇怪,為什麼Django是紐約時報,衛報,Pinterest和Instagram等網站和服務的基礎。
  • zuihou-admin-cloud 1.8 發布,支持 Cloud Alibaba 2.2.0
    希望能努力打造一套從 SaaS基礎框架 - 分布式微服務架構 - 自動化部署 - 系統監測 的解決方案。本項目旨在實現基礎能力,不涉及具體業務。故在hibernate-validator的基礎上封裝了zuihou-validator-starter起步依賴,提供一個通用接口,可以獲取需要校驗表單的規則,然後前端使用後端返回的規則, 以後若規則改變,只需要後端修改即可。
  • 對後臺登陸頁面的滲透測試
    zxc123456 19 asdasd 19 as123456 19 666666 19 521521 19 112233 18 q1w2e3 18 abcd1234 18 aaa123 17 qazwsx123 17 qaz123 17 aaaaaa 17 a123321 17 12qwaszx
  • Dcat Admin v1.7.0 發布,對後端開發者友好的高顏值後臺系統構建工具
    2.全新菜單樣式以及布局本次版本增加了新的菜單樣式,在配置文件config/admin.php中加上配置參數admin.layout.sidebar_style3.權限配置功能優化配置權限路徑時支持填寫路由別名,如 admin.users.show
  • zuihou-admin-cloud 2.1 發布,租戶模式支持動態新增數據源 - OS...
    簡化租戶後臺系統相關接口邏輯 (zuihou-admin-ui)13. 廢除之前的配置在Controller層的聲明式事務配置,採用註解配置事務,調整事務控制到service層,通過註解來控制事務,原因是兼容多數據源模式。14. SuperCacheServiceImpl 相關方法加上事務註解。15.
  • asp.net4.0,dll後臺限制破解
    【新朋友】點擊標題下面藍字「黑白之道」關注【老朋友】點擊右上角,分享或收藏本頁精彩內容【公眾號】搜索公眾號:黑白之道,或者ID:i77169 有一個客戶買的程序,放我們這裡了犀牛雲的自助建站,他們給網站打包了,只能打開,不能更新後臺