xadmin 組件拓展自定義使用


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_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()

 

效果

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM