xadmin 組件相關可選自定義字段
list_display
功能
設置默認的顯示字段(列)
配置
list_display = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'add_time', 'get_zj_nums', 'go_to']
# 自己定義的函數也可以被當做字段來展示, 展示結果為函數的運算結果 ( 返回值 )
效果
顯示列中也可以手動更改顯示字段 ( 列 ), 但是下次刷新的時候會恢復為只顯示 list_display 中的字段 ( 列 )
ps 自定義函數的字段顯示
在相關的 model 中設置一段邏輯實現某些功能, 默認如果未配置 short_description 會以函數名為顯示字段
設置后則用設置值為xadmin后台顯示字段名, 顯示內容為函數返回值
# 定義自定義的一個跳轉字段, 內部為html代碼的形式 def go_to(self): from django.utils.safestring import mark_safe return mark_safe("<a href='http://wwww.baidu.com'>跳轉</a>") go_to.short_description = "跳轉"
search_fields
功能
設置搜索字段索引
配置
放入列表的字段可以被視為可被搜索域
search_fields = ['name', 'desc', 'detail', 'degree', 'students', 'fav_nums', 'click_nums']
效果
list_filter
功能
設置過濾器
配置
list_filter = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums','add_time']
效果
不同類型的字段會展示出不同的過濾選項
ordering
功能
初始展示時的默認排序方式
配置
ordering = ['-click_nums']
效果
其他的字段也可以進行手動的選擇排序,刷新后恢復為默認排序
readonly_fields
功能
設置只讀字段, 不可編輯
配置
readonly_fields = ['fav_nums']
效果
進入編輯頁面后此字段是無法修改的狀態
exclude
功能
設置不可見, 隱藏字段
配置
readonly_fields 和 exclude 是沖突的, 兩個都設置會讓 exclude 失效以只讀顯示
exclude = ['click_nums']
效果
設置前
設置后
list_editable
功能
配置可編輯字段, 無需進入編輯頁面即可編輯相關字段內容
配置
list_editable = ['degree', 'desc']
效果
refresh_times
功能
設置 xadmin 后台刷新頻率
配置
列表內的內容為單位秒, 設置多個為可選項
refresh_times = [3,5]
效果
inlines
功能
設置外鍵字典內容可被修改
配置
在此處應用場景中, Course 表有兩個反向的外鍵字段連接到 Lesson表 和 CourseResource 表
為了實現在編輯 Course表的時候就可以更方便的一起把 此表相關聯的 這兩個字段內容改了會很舒服
進行此項設置, 需要提前寫一個類, 內置兩個字典 為 model 表名和 extar = 0 然后加入到 inlines 中
class LessonInline(object): model = Lesson extar = 0 class CourseResourceInline(object): model = CourseResource extar = 0
inlines = [LessonInline, CourseResourceInline]
效果
課程表中是沒有章節字段和課程資源字段的( 因為是反向外鍵設置 ), 設置此字段后
這樣我們在更改課程的時候就也可以順帶着添加章節和課程資源了. 就用戶體驗而言是很舒服的
當然你如果不設置此字段,想添加外鍵實際上也可以通過外層的時候的最后面的符號進行所有的外鍵操作, 不如在里面添加來的直觀和舒適
queryset
功能
將一張表根據某個字段作為區分為多表
配置
若想實現上下分表則需要重寫 queryset 方法
此處配置為 以 is_banner 作為標識區分,原表中 所有 is_banner = False 的數據被篩選出來
def queryset(self): # 實現上下分表, 將輪播課程另外顯示 qs = super(CourseAdmin, self).queryset() qs = qs.filter(is_banner=False) return qs
在model 中需要做此設置, 繼承原表, proxy 設置為 True
class BannerCourse(Course): class Meta: verbose_name = "輪播課程" verbose_name_plural = verbose_name proxy = True # 不設置這個就會再生成一張表
然后在 adminx 中在將此模型進行 注冊, 同原表 Course 一樣的注冊方式 ( xadmin 會視其為另一張表 )
此時的 重寫 queryset 則為 is_banner = True 和原表進行上下分離
# 輪播課程注冊 class BannerCourseAdmin(object): list_display = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'add_time'] search_fields = ['name', 'desc', 'detail', 'degree', 'students', 'fav_nums', 'click_nums'] list_filter = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'add_time'] ordering = ['-click_nums'] readonly_fields = ['fav_nums'] exclude = ['click_nums'] inlines = [LessonInline, CourseResourceInline] def queryset(self): qs = super(BannerCourseAdmin, self).queryset() qs = qs.filter(is_banner=True) return qs
效果
課程和輪播課程以是否輪播字段作為區分為兩份表, 在 sql 中根源都是課程表
但是展示結果為
課程 = 不輪播的課程
輪播課程 = 輪播的課程
在 xadmin 中被視為兩份獨立的表分別進行各自定義的操作
save_models
功能
實現字段彼此的聯動操作
配置
此處的應用場景是 課程添加后, 課程結構的可選課程數量跟隨加1 ( 本質是即時更新 )
def save_models(self): # 在保存課程的時候統計課程機構的課程數 obj = self.new_obj obj.save() if obj.course_org is not None: course_org = obj.course_org course_org.course_nums = Course.objects.filter(course_org=course_org).count() course_org.save()
效果
不截圖了.這個就是普通的數據更新, 沒啥界面變化