設置默認的顯示字段(列)html
list_display = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums', 'add_time', 'get_zj_nums', 'go_to']
# 本身定義的函數也能夠被當作字段來展現, 展現結果爲函數的運算結果 ( 返回值 )
顯示列中也能夠手動更改顯示字段 ( 列 ), 可是下次刷新的時候會恢復爲只顯示 list_display 中的字段 ( 列 )sql
在相關的 model 中設置一段邏輯實現某些功能, 默認若是未配置 short_description 會以函數名爲顯示字段django
設置後則用設置值爲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 = "跳轉"
設置搜索字段索引spa
放入列表的字段能夠被視爲可被搜索域3d
search_fields = ['name', 'desc', 'detail', 'degree', 'students', 'fav_nums', 'click_nums']
設置過濾器code
list_filter = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums','add_time']
不一樣類型的字段會展現出不一樣的過濾選項htm
初始展現時的默認排序方式blog
ordering = ['-click_nums']
其餘的字段也能夠進行手動的選擇排序,刷新後恢復爲默認排序排序
設置只讀字段, 不可編輯
readonly_fields = ['fav_nums']
進入編輯頁面後此字段是沒法修改的狀態
設置不可見, 隱藏字段
readonly_fields 和 exclude 是衝突的, 兩個都設置會讓 exclude 失效以只讀顯示
exclude = ['click_nums']
設置前
設置後
配置可編輯字段, 無需進入編輯頁面便可編輯相關字段內容
list_editable = ['degree', 'desc']
設置 xadmin 後臺刷新頻率
列表內的內容爲單位秒, 設置多個爲可選項
refresh_times = [3,5]
設置外鍵字典內容可被修改
在此處應用場景中, 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 方法
此處配置爲 以 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 中被視爲兩份獨立的表分別進行各自定義的操做
實現字段彼此的聯動操做
此處的應用場景是 課程添加後, 課程結構的可選課程數量跟隨加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()
不截圖了.這個就是普通的數據更新, 沒啥界面變化