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_safereturn 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 = Lessonextar = 0class CourseResourceInline(object):model = CourseResourceextar = 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_nameproxy = 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_objobj.save()if obj.course_org is not None:course_org = obj.course_orgcourse_org.course_nums = Course.objects.filter(course_org=course_org).count()course_org.save()
效果
不截图了.这个就是普通的数据更新, 没啥界面变化
转载于:https://www.cnblogs.com/shijieli/p/10661678.html
xadmin 组件拓展自定义使用相关推荐
- 【uniapp前端组件】自定义车牌键盘
自定义车牌输入键盘–车牌键盘 简介 本组件根据自定义万能键盘(数字键盘.身份证键盘.带小数点数字键盘.车牌键盘)升级而来,老组件代码有点看不懂了,哈哈哈哈.另外数字键盘.身份证键盘.小数点数字键盘un ...
- 小程序-实现自定义组件以及自定义组件间的通信
前言 对于组件的封装,在小程序当中对于多个页面的复用有着重要的作用,小程序中注册的每个页面都是独立的 页面的显示view层与逻辑层是通过data进行绑定关联,若需要更改页面中的数据,则通过setDat ...
- Hadoop生态圈-Flume的组件之自定义拦截器(interceptor)
Hadoop生态圈-Flume的组件之自定义拦截器(interceptor) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客只是举例了一个自定义拦截器的方法,测试字节传输速 ...
- taro 在components文件夹中 新建组件时,组件支持自定义命名,但是不能大写开头...
在components文件夹中 新建组件时,组件支持自定义命名,但是不能大写开头.否则会报错 错误写法: // 真实路径 import MinaMask from '../../components/ ...
- 【Flutter】自定义 Flutter 组件 ( 创建自定义 StatelessWidget、StatefulWidget 组件 | 调用自定义组件 )
文章目录 一.Flutter 组件简介 二.Flutter 自定义 StatelessWidget 组件流程 1.导入父类包 2.选择继承的父类 3.设置成员变量及构造函数 4.重写 build 方法 ...
- [vue] vue给组件绑定自定义事件无效怎么解决?
[vue] vue给组件绑定自定义事件无效怎么解决? 两种方式 1.组件外部加修饰符.navtive 2.组件内部声明$emit('自定义事件') 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放 ...
- elementUI的DatePicker+DateTimePicker组件的自定义日期禁用
elementUI的DatePicker+DateTimePicker组件的自定义日期禁用
- f2 柱状图滚动 钉钉小程序_详解钉钉小程序组件之自定义模态框(弹窗封装实现)...
背景 开发钉钉小程序中需要用到模态框 文档里也没有 自己搞一个- 效果大概长这个样 点击指定按钮,弹出模态框,里面的内容可以自定义,可以是简单的文字提示,也可以输入框等复杂布局.操作完点击取消或确定关 ...
- elementUI表格组件:自定义列模板(完整案例)
elementUI表格组件:自定义列模板(含效果图) 所谓的自定义列模板,你也可以理解为自定义td的格式. 官方文档地址 :查看地址 页面· 效果图 · 对比 : 代码块1 · 对比:<temp ...
- form-create教程:给内置组件和自定义组件添加事件
本文将介绍form-create如何给内置组件和自定义组件添加事件 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue ...
最新文章
- python十进制转八进制_怎样用python进行二进制,八进制,十进制转换
- ajax图书管理案例
- 矩阵快速幂 - 湘潭大学
- 百度申请“员工工作状态预测”专利,意欲何为?
- ML之FE:Kaggle比赛之根据城市自行车共享系统数据进行FE+预测在某个时间段自行车被租出去的个数
- 2020年行政区划代码_2020年梧州市行政区划,了解梧州市有几个区,详细数据
- android 保存数据到setting中_文章如何保存在数据库中
- pb 应用 迁移 linux_功能化生物炭应用研究取得系列进展
- Linux命令-磁盘管理(二)
- OpenFOAM并行计算方法
- 数据结构算法 二进制转十进制_数据结构 - 栈
- 基于Promise对象的新一代Ajax API--fetch
- 【渝粤教育】国家开放大学2019年春季 1152教育法学 参考试题
- 使用计算列提高查询性能
- asp.mvc 基本知识
- 统计自然语言处理——信息论基础
- 【博弈论】势博弈(potential game)、EPG以及最佳响应、Nash均衡和帕累托(pareto)最优的理解
- Ubuntu 安装sopcast-player看网络电视
- dB, -3dB, -6dB相关知识
- ubuntu创建桌面快捷方式
热门文章
- BM25算法的python实现
- [Noip2007]Core树网的核
- Linux中mongodb定时远程备份
- 剑指offer之【树的子结构】
- 工欲善其事必先利其器——dreamweaver
- centos下yum安装wget失败
- 浅析中断——回首两年
- KORG Software TRITON for mac(虚拟合成器软件)
- 微信 for Mac 3.1.0 测试版发布,支持发朋友圈啦!
- WeChatExtension for Mac(mac微信小助手)支持big surv2.7.0中文修复版