iT邦幫忙

2022 iThome 鐵人賽

DAY 11
0

Day 11 ModelAdmin,成為一名模型管理員

為模型建立管理介面非常簡單,僅僅只需要一行程式碼。但是面臨各種需求的時候就不是這麼容易了,這些就需要一個一個自己刻出來了...嗎?

才不是呢,我們就像是站在巨人的肩膀上,Django 有各種選項可以進行設定,使用 ModelAdmin 大大幫助了我們對管理介面進行調整,下面就來介紹要如何進行設定吧!

ModelAdmin 常用選項

ModelAdmin 有各種選項可以進行調整,可以用來自定義模型管理介面的呈現方式,頁面主要分為列表頁面與新增修改頁面兩種,下面將會介紹一些常會使用到的選項:

fileds

設定在新增、修改頁面的欄位配置,可用小括號進行分組

class ExampleAdmin(admin.ModelAdmin):
    fields = ('field_name', 'field2_name', 'field3_name')

# 分組
class ExampleAdmin(admin.ModelAdmin):
    fields = (('field_name', 'field2_name'), 'field3_name') 

fieldsets

進階設定在新增、修改頁面的欄位配置,由多個 (name, field_options) 的 tuple 組成。其中 classes 為包含額外的 css 類的串列或元組

class ExampleAdmin(admin.ModelAdmin):
    fieldsets = (
        (None, {
            'fields': ('field_name', 'field2_name', 'field3_name')
        }),
        ('tab2', {
            'classes': ('collapse',),
            'fields': ('field4_name', 'field5_name'),
        }),
    )

exclude

設定表單要排除的特定欄位

class ExampleAdmin(admin.ModelAdmin):
    exclude = ('field_name',)

form

設定指定的 form 表單

class ExampleAdmin(admin.ModelAdmin):
    form = ExampleForm

inlines

設定 InlineModelAdmin 內嵌管理介面

class ExampleAdmin(admin.ModelAdmin):
    inlines = [
        ExampleAdminInline,
    ]

list_display

設定要在在列表頁面顯示的欄位,可使用模型實例引數與自定義方法。

class ExampleAdmin(admin.ModelAdmin):
    list_display = ('field_name', 'field2_name')

readonly_fields

設定不可編輯欄位(管理介面預設所有欄位皆可編輯)。

class ExampleAdmin(admin.ModelAdmin):
    readonly_fields = ('field_name',)

empty_value_display

為預設空值(None)會顯示為 -,此屬性可以覆蓋 - 為自定義的內容。

list_editable

在列表頁面設定可編輯的欄位,該欄位必須已設定在 list_display 中

class ExampleAdmin(admin.ModelAdmin):
    list_editable = ('field_name',)

list_filter

設定欄位啟用列表頁面右側的篩選器

class ExampleAdmin(admin.ModelAdmin):
    list_filter = ('field_name',)

filter_horizontal

設定 ManyToManyField (多對多欄位)的下拉選單篩選器。

class ExampleAdmin(admin.ModelAdmin):
    filter_horizontal = ('field_name',)

list_per_page

設定每個列表頁面的項目數量,預設為 100 。

class ExampleAdmin(admin.ModelAdmin):
    list_per_page = 20

search_fields

設定列表頁面的搜尋框,可以使用欄位名稱或是關聯欄位名稱 API。

# 欄位名稱
class ExampleAdmin(admin.ModelAdmin):
    search_fields = ['field_name']

# 關聯欄位名稱 API
class ExampleAdmin(admin.ModelAdmin):
    search_fields = ['foreign_key__related_fieldname']

autocomplete_fields

設定 ForeignKey (多對一欄位) 或是 ManyToManyField (多對多欄位)在新增修改頁面為 select2 自動完成輸入,需要在相關物件的 ModelAdmin 定義 search_fields。

class ExampleAdmin(admin.ModelAdmin):
    autocomplete_fields = ('foreignkey_field_name',)

class ExampleNewAdmin(admin.ModelAdmin):
    search_fields = ['field_name']

實作 ModelAdmin

在『Django Admin,管理室不收管理費』章節中我們發現 ProductAdmin 在列表頁面沒有足夠詳細的資訊讓使用者一目了然,在學習了相關的參數設定後,來進行調整吧!

繼承 ModelAdmin

這邊要注意使用 ModelAdmin 要在註冊的模型後要加上指定的 ModelAdmin 物件。

class ProductAdmin(admin.ModelAdmin):

# ...

class ProductCategoryAdmin(admin.ModelAdmin):

# ...

admin.site.register(Product, ProductAdmin)
admin.site.register(ProductCategory, ProductCategoryAdmin)

設定欄位 field 與只讀欄位 readonly_field

因為 created 與 modified 欄位有 auto_now 屬性,需要加上 readonly_field 才能顯示在 admin 中。

class ProductAdmin(admin.ModelAdmin):
    fields = ('name', 'description', 'price', 'category', 'created', 'modified')
    readonly_fields = ('created', 'modified')

class ProductCategoryAdmin(admin.ModelAdmin):
    fields = ('name', 'description', 'created', 'modified')
    readonly_fields = ('created', 'modified')

admin.site.register(Product, ProductAdmin)
admin.site.register(ProductCategory, ProductCategoryAdmin)

設定列表頁面顯示欄位 list_display

from django.contrib import admin
from products.models import Product, ProductCategory

# Register your models here.
class ProductAdmin(admin.ModelAdmin):
    fields = ('name', 'description', 'price', 'category', 'created', 'modified')
    list_display = ('name', 'price', 'category')
    readonly_fields = ('created', 'modified')

class ProductCategoryAdmin(admin.ModelAdmin):
    fields = ('name', 'description', 'created', 'modified')
    list_display = ('name',)
    readonly_fields = ('created', 'modified')

admin.site.register(Product, ProductAdmin)         # 註冊 Product 模型
admin.site.register(ProductCategory, ProductCategoryAdmin)    # 註冊 ProductCategory 模型

在列表頁面一目了然的顯示了商品名稱、商品價格與商品分類

https://ithelp.ithome.com.tw/upload/images/20220923/201516560HT3HE8ZHx.png

設定列表頁面查詢框 search_fields

from django.contrib import admin
from products.models import Product, ProductCategory

# Register your models here.
class ProductAdmin(admin.ModelAdmin):
    search_fields = ['name', 'category__name'] # 設定列表頁面查詢框
    fields = ('name', 'description', 'price', 'category', 'created', 'modified')
    list_display = ('name', 'price', 'category')
    list_filter = ('category',)
    readonly_fields = ('created', 'modified')

class ProductCategoryAdmin(admin.ModelAdmin):
    search_fields = ['name'] # 設定列表頁面查詢框
    fields = ('name', 'description', 'created', 'modified')
    list_display = ('name',)
    readonly_fields = ('created', 'modified')

admin.site.register(Product, ProductAdmin)
admin.site.register(ProductCategory, ProductCategoryAdmin)

上方出現了搜尋框,其中 category__name 是使用關聯欄位名稱API,可以對 ForeignKey 欄位進行查詢。

https://ithelp.ithome.com.tw/upload/images/20220923/20151656M86tXlT3ql.png

新增修改頁面關聯欄位查詢框 autocomplete_fields

from django.contrib import admin
from products.models import Product, ProductCategory

# Register your models here.
class ProductAdmin(admin.ModelAdmin):
    search_fields = ['name', 'category__name']
    fields = ('name', 'description', 'price', 'category', 'created', 'modified')
    list_display = ('name', 'price', 'category')
    list_filter = ('category',)
    autocomplete_fields = ['category'] # 新增修改頁面關聯欄位查詢框
    readonly_fields = ('created', 'modified')

class ProductCategoryAdmin(admin.ModelAdmin):
    search_fields = ['name']
    fields = ('name', 'description', 'created', 'modified')
    list_display = ('name',)
    readonly_fields = ('created', 'modified')

admin.site.register(Product, ProductAdmin)
admin.site.register(ProductCategory, ProductCategoryAdmin)

輕鬆的新增了 select2 的篩選下拉選單,不必擔心過多資料而無法快速找到。

https://ithelp.ithome.com.tw/upload/images/20220923/20151656zI1wuI5SzO.png

Admin 管理介面的部分到這裡告一段落,接下來我們會繼續把電商網站的雛型完成,有了基礎的架構後再開始延伸多租戶架構的相關知識。

明天我們將先進行工作前準備 『居家上班要懂的 Django 工作流程』!


上一篇
Day 10 Django Admin,管理室不收管理費
下一篇
Day 12 居家上班要懂的 Django 工作流程
系列文
全能住宅改造王,Django 多租戶架構的應用 —— 實作一個電商網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言