xadmin 組件拓展自定義使用

xadmin 組件相關可選自定義字段

list_display

功能

設置默認的顯示字段(列)html

配置

 list_display = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students',
                 'fav_nums', 'click_nums', 'add_time', 'get_zj_nums', 'go_to']  
# 本身定義的函數也能夠被當作字段來展現, 展現結果爲函數的運算結果 ( 返回值 )

效果

顯示列中也能夠手動更改顯示字段 ( 列 ), 可是下次刷新的時候會恢復爲只顯示 list_display 中的字段 ( 列 )sql

ps 自定義函數的字段顯示

在相關的 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 = "跳轉"

search_fields

功能

設置搜索字段索引spa

配置

放入列表的字段能夠被視爲可被搜索域3d

search_fields = ['name', 'desc', 'detail', 'degree', 'students', 'fav_nums', 'click_nums']

效果

 

list_filter

功能

設置過濾器code

配置

list_filter = ['name', 'desc', 'detail', 'degree', 'learn_time', 'students', 'fav_nums', 'click_nums','add_time']

效果

不一樣類型的字段會展現出不一樣的過濾選項htm

ordering

功能

初始展現時的默認排序方式blog

配置

ordering = ['-click_nums'] 

效果

其餘的字段也能夠進行手動的選擇排序,刷新後恢復爲默認排序排序

 

readonly_fields

功能

設置只讀字段, 不可編輯  

配置

readonly_fields = ['fav_nums'] 

效果

進入編輯頁面後此字段是沒法修改的狀態

exclude

功能

設置不可見, 隱藏字段

配置

readonly_fieldsexclude 是衝突的, 兩個都設置會讓 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()

 

效果

不截圖了.這個就是普通的數據更新, 沒啥界面變化

相關文章
相關標籤/搜索