1. 程式人生 > >深入理解Django Admin的list_display, list_filter和raw_id_fields,filter_horizontal選項。

深入理解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