對於習慣了自己動手編寫後臺的小編我而言,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