深入理解Django Admin的list_display, list_filter和raw_id_fields,filter_horizontal選項。
對於習慣了自己動手編寫後臺的小編我而言,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選項,如下圖所示:
大江狗
2018.10.29