xadmin的进阶开发

因版本问题.有些配置可能无效

自定义icon

xadmin的图标采用的是第三方css样式font awesome,我们可以进官网下载最新的样式替代原本的,下载地址:http://www.fontawesome.com.cn/

下载完后把里面的“css”和“fonts”两个文件夹拷贝到xadmin的源码(路径:xadmin/static/vendor/font-awesome)里面

使用model_icon来进行修改

  1. # Course的admin管理器
  2. class CourseAdmin(object):
  3. '''课程'''
  4. list_display = [ 'name','desc','detail','degree','learn_times','students']
  5. search_fields = ['name', 'desc', 'detail', 'degree', 'students']
  6. list_filter = [ 'name','desc','detail','degree','learn_times','students']
  7. model_icon = 'fa fa-book'

默认排序、只读字段和不显示的字段

课程:

  • 按点击数倒序排序
  • 点击数不能编辑
  • 不显示收藏人数
  1. # Course的admin管理器
  2. class CourseAdmin(object):
  3. '''课程'''
  4. list_display = [ 'name','desc','detail','degree','learn_times','students'] #显示的字段
  5. search_fields = ['name', 'desc', 'detail', 'degree', 'students'] #搜索
  6. list_filter = [ 'name','desc','detail','degree','learn_times','students'] #过滤
  7. model_icon = 'fa fa-book' #图标
  8. ordering = ['-click_nums'] #排序
  9. readonly_fields = ['click_nums'] #只读字段,不能编辑
  10. exclude = ['fav_nums'] #不显示的字段

下拉框搜索

写在外键所指的adminx配置中

  1. relfield_style = 'fk-ajax'

当有外键指向他,会以ajax方式加载

数据量过大时很有用

inlines添加数据

目前在添加课程的时候没法添加章节和课程资源,我们可以用inlines去实现这一功能

  1. class LessonInline(object):
  2. model = Lesson
  3. extra = 0
  4. class CourseResourceInline(object):
  5. model = CourseResource
  6. extra = 0
  7. # 在CourseAdmin中使用inlines添加上面两个的方法
  8. class CourseAdmin(object):
  9. inlines = [LessonInline,CourseResourceInline] #增加章节和课程资源

一张表分两个Model来管理

课程里面分为轮播课程和不是轮播课程两种类型,我们可以分开来管理

course/models.py里面新建一个Model

  1. class BannerCourse(Course):
  2. '''显示轮播课程'''
  3. class Meta:
  4. verbose_name = '轮播课程'
  5. verbose_name_plural = verbose_name
  6. #这里必须设置proxy=True,这样就不会再生成一张表,同时还具有Model的功能
  7. proxy = True

course/adminx.py

  1. class CourseAdmin(object):
  2. '''课程'''
  3. list_display = [ 'name','desc','detail','degree','learn_times','students'] #显示的字段
  4. search_fields = ['name', 'desc', 'detail', 'degree', 'students'] #搜索
  5. list_filter = [ 'name','desc','detail','degree','learn_times','students'] #过滤
  6. model_icon = 'fa fa-book' #图标
  7. ordering = ['-click_nums'] #排序
  8. readonly_fields = ['click_nums'] #只读字段
  9. exclude = ['fav_nums'] #不显示的字段
  10. inlines = [LessonInline,CourseResourceInline] #增加章节和课程资源
  11. def queryset(self):
  12. # 重载queryset方法,来过滤出我们想要的数据的
  13. qs = super(CourseAdmin, self).queryset()
  14. # 只显示is_banner=True的课程
  15. qs = qs.filter(is_banner=False)
  16. return qs
  17. class BannerCourseAdmin(object):
  18. '''轮播课程'''
  19. list_display = [ 'name','desc','detail','degree','learn_times','students']
  20. search_fields = ['name', 'desc', 'detail', 'degree', 'students']
  21. list_filter = [ 'name','desc','detail','degree','learn_times','students']
  22. model_icon = 'fa fa-book'
  23. ordering = ['-click_nums']
  24. readonly_fields = ['click_nums']
  25. exclude = ['fav_nums']
  26. inlines = [LessonInline,CourseResourceInline]
  27. def queryset(self):
  28. #重载queryset方法,来过滤出我们想要的数据的
  29. qs = super(BannerCourseAdmin, self).queryset()
  30. #只显示is_banner=True的课程
  31. qs = qs.filter(is_banner=True)
  32. return qs
  33. # 将管理器与model进行注册关联
  34. xadmin.site.register(Course, CourseAdmin)
  35. xadmin.site.register(BannerCourse, BannerCourseAdmin)

xadmin的其它常见功能

可以在列表上快速修改内容

  1. list_editable = [ 'degree','desc']

自定义函数作为列

  1. def get_zj_nums(self):
  2. return self.lesson_set.all().count()
  3. get_zj_nums.short_description = "章节数"

显示自定义的html代码

  1. def go_to(self):
  2. from django.utils.safestring import mark_safe
  3. # 如果不mark safe。会对其进行转义
  4. return mark_safe("<a href='http://iceflower.xyz'>跳转</>")
  5. go_to.short_description = "跳转"

refresh定时刷新工具

  1. refresh_times = [3,5] #自动刷新(里面是秒数)

字段联动

应用场景:当添加一门课程的时候,希望课程机构里面的课程数 +1

重写xadmin的save_models方法

  1. def save_models(self):
  2. # 在保存课程的时候统计课程机构的课程数
  3. # 字段联动
  4. obj = self.new_obj
  5. # 新增课程还没有保存,统计的课程数少一个
  6. obj.save()
  7. # 必须确定存在。
  8. if obj.course_org is not None:
  9. # obj实际是一个course对象
  10. course_org = obj.course_org
  11. course_org.course_nums = Course.objects.filter(course_org = course_org).count()
  12. course_org.save()

xadmin自行探究

  • local 语言包
  • migration 数据表的记录
  • plugins 每一个后台页面都是一个plugin 插件机制
  • static文件。js css
  • template xadmin自己用到的html文件
  • 对django admin的封装

增加富文本编辑器Ueditor

下载地址 https://github.com/twz915/DjangoUeditor3/

解压后,把DjangoUeditor文件夹拷贝到项目目录下面

  1. # settings中添加app
  2. INSTALLED_APPS = [
  3. 'DjangoUeditor',
  4. ]
  1.  # 富文本编辑器url
  2. path('ueditor/',include('DjangoUeditor.urls' )),

course/models.py中Course修改detail字段

  1. class Course(models.Model):
  2. # detail = models.TextField("课程详情")
  3. detail = UEditorField(verbose_name=u'课程详情', width=600, height=300, imagePath="courses/ueditor/",
  4. filePath="courses/ueditor/", default='')

xadmin/plugs目录下新建ueditor.py文件,代码如下

  1. import xadmin
  2. from xadmin.views import BaseAdminPlugin, CreateAdminView, ModelFormAdminView, UpdateAdminView
  3. from DjangoUeditor.models import UEditorField
  4. from DjangoUeditor.widgets import UEditorWidget
  5. from django.conf import settings
  6. class XadminUEditorWidget(UEditorWidget):
  7. def __init__(self, **kwargs):
  8. self.ueditor_options = kwargs
  9. self.Media.js = None
  10. super(XadminUEditorWidget,self).__init__(kwargs)
  11. class UeditorPlugin(BaseAdminPlugin):
  12. def get_field_style(self, attrs, db_field, style, **kwargs):
  13. if style == 'ueditor':
  14. if isinstance(db_field, UEditorField):
  15. widget = db_field.formfield().widget
  16. param = {}
  17. param.update(widget.ueditor_settings)
  18. param.update(widget.attrs)
  19. return {'widget':XadminUEditorWidget(**param)}
  20. return attrs
  21. def block_extrahead(self, context, nodes):
  22. js = '<script type="text/javascript" src="%s"></script>' %(settings.STATIC_URL + "ueditor/ueditor.config.js")
  23. js += '<script type="text/javascript" src="%s"></script>' %(settings.STATIC_URL + "ueditor/ueditor.all.min.js")
  24. nodes.append(js)
  25. xadmin.site.register_plugin(UeditorPlugin, UpdateAdminView)
  26. xadmin.site.register_plugin(UeditorPlugin, CreateAdminView)

xadmin/plugs/__init__.py里面添加ueditor插件

  1. PLUGINS = (
  2. 'ueditor',
  3. )

course/adminx.py中使用

  1. class CourseAdmin(object):
  2. #detail就是要显示为富文本的字段名
  3. style_fields = {"detail": "ueditor"}

在模板中必须关闭Django的自动转义才能正常显示

  1. <div class="tab_cont tab_cont1">
  2. {% autoescape off %}
  3. {{ course.detail }}
  4. {% endautoescape %}
  5. </div>

或者

  1. {{ course.detail|safe }}

导入excel

  • 如何注入导入excel代码到菜单
  • 如何只在课程列表显示
  • 如何接收文件对文件进行处理

新建xadmin/plugins/excel.py

  1. import xadmin
  2. from xadmin.views import BaseAdminPlugin, ListAdminView
  3. from django.template import loader
  4. #excel 导入
  5. class ListImportExcelPlugin(BaseAdminPlugin):
  6. import_excel = False
  7. def init_request(self, *args, **kwargs):
  8. return bool(self.import_excel)
  9. def block_top_toolbar(self, context, nodes):
  10. nodes.append(loader.render_to_string('xadmin/excel/model_list.top_toolbar.import.html', context=get_context_dict(context)))
  11. xadmin.site.register_plugin(ListImportExcelPlugin, ListAdminView)

添加到__init__.py文件中

  1. PLUGINS = (
  2. 'excel',
  3. )

新建xadmin/templates/xadmin/excel/model_list.top_toolbar.import.html

  1. {% load i18n %}
  2. <div class="btn-group export">
  3. <a class="dropdown-toggle btn btn-default btn-sm" data-toggle="dropdown" href="#">
  4. <i class="icon-share"></i> 导入 <span class="caret"></span>
  5. </a>
  6. <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
  7. <li><a data-toggle="modal" data-target="#export-modal-import-excel"><i class="icon-circle-arrow-down"></i> 导入 Excel</a></li>
  8. </ul>
  9. <script>
  10. function fileChange(target){
  11. //检测上传文件的类型
  12. var imgName = document.all.submit_upload.value;
  13. var ext,idx;
  14. if (imgName == ''){
  15. document.all.submit_upload_b.disabled=true;
  16. alert("请选择需要上传的 xls 文件!");
  17. return;
  18. } else {
  19. idx = imgName.lastIndexOf(".");
  20. if (idx != -1){
  21. ext = imgName.substr(idx+1).toUpperCase();
  22. ext = ext.toLowerCase( );
  23. {# alert("ext="+ext);#}
  24. if (ext != 'xls' && ext != 'xlsx'){
  25. document.all.submit_upload_b.disabled=true;
  26. alert("只能上传 .xls 类型的文件!");
  27. return;
  28. }
  29. } else {
  30. document.all.submit_upload_b.disabled=true;
  31. alert("只能上传 .xls 类型的文件!");
  32. return;
  33. }
  34. }
  35. }
  36. </script>
  37. <div id="export-modal-import-excel" class="modal fade">
  38. <div class="modal-dialog">
  39. <div class="modal-content">
  40. <form method="post" action="" enctype="multipart/form-data">
  41. {% csrf_token %}
  42. <div class="modal-header">
  43. <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
  44. <h4 class="modal-title">导入 Excel</h4>
  45. </div>
  46. <div class="modal-body">
  47. <input type="file" onchange="fileChange(this)" name="excel" id="submit_upload">
  48. </div>
  49. <div class="modal-footer">
  50. <button type="button" class="btn btn-default" data-dismiss="modal">{% trans "Close" %}</button>
  51. <button class="btn btn-success" type="submit" id="submit_upload_b"><i class="icon-share"></i> 导入</button>
  52. </div>
  53. </form>
  54. </div><!-- /.modal-content -->
  55. </div><!-- /.modal-dalog -->
  56. </div><!-- /.modal -->
  57. </div>

只需要在adminx中设置变量import_excel=True就可以开启导入按钮

在adminx中重写post方法,将文件内容保存到数据中

  1. def post(self, request, *args , **kwargs):
  2. if 'excel' in request.FILES:
  3. pass
  1. # 中间pass步骤不管做什么事情,都要最后return父类的
  2. return super(CourseAdmin, self).post(request, args, kwargs)

Django+Xadmin打造在线教育系统(九)的更多相关文章

  1. Django+Xadmin打造在线教育系统(四)

    完成授课机构的功能 模板继承 在templates目录下,新建base.html,剪切org-list.html内容到里面 编写org-list.html内容 继承base.html,将里面的面包屑和 ...

  2. Django+Xadmin打造在线教育系统(三)

    完成登录 注册 找回密码 激活 验证码集成 将HTML文件拷贝到templates目录下,css,js,img,media,images文件夹拷贝到static文件夹下 修改index.html和lo ...

  3. Django+Xadmin打造在线教育系统(二)

    基于xadmin的后台管理 先使用pip进行安装xadmin及其依赖包 pip install django-adminx 安装完成后卸载xadmin,保留依赖包即可 pip uninstall dj ...

  4. Django+Xadmin打造在线教育系统(七)

    全局导航&个人中心&全局搜索 配置全局导航 让index页面也继承base页面,注意首页有个单独的__index.js__ base页面的导航栏也进行配置 <nav> &l ...

  5. Django+Xadmin打造在线教育系统(一)

    系统概括: 系统具有完整的用户登录注册以及找回密码功能,拥有完整个人中心. 个人中心: 修改头像,修改密码,修改邮箱,可以看到我的课程以及我的收藏.可以删除收藏,我的消息. 导航栏: 公开课,授课讲师 ...

  6. Django+Xadmin打造在线教育系统(八)

    首页和全局404,500配置 轮播图 公开课 授课机构 新建view ## 首页view class IndexView(View): def get(self,request): # 取出轮播图 a ...

  7. Django+Xadmin打造在线教育系统(五)

    课程相关功能实现 课程列表 创建课程相关的urls.py path("course/", include('course.urls', namespace="course ...

  8. Django+Xadmin打造在线教育系统(六)

    讲师相关功能实现 拷贝并修改teacher-list.html和teacher-detail.html, 继承base模板 # 讲师列表 path('teacher_list/', TeacherLi ...

  9. Django+xadmin打造在线教育平台(一)

    目录 在线教育平台(一)      在线教育平台(二) 在线教育平台(三)      在线教育平台(四) 在线教育平台(五)      在线教育平台(六) 在线教育平台(七)      在线教育平台( ...

随机推荐

  1. Windows Community Toolkit 4.0 - DataGrid - Part02

    概述 在上面一篇 Windows Community Toolkit 4.0 - DataGrid - Part01 中,我们针对 DataGrid 控件的 CollectionView 部分做了详细 ...

  2. Mac 小记 — iTerm2、Zsh、Homebrew

    前言 写完 "Ubuntu 自动化配置" 这篇文章后,每次连服务器心情指数都上升好几个百分点,于是想着应该将 macOs 的开发环境也梳理梳理,应该会对开发效率有所增益. 1. i ...

  3. Django组件 之 ookie 和 session

    -----------------------------------------------------------------------------------------相信自己,水滴石穿,不 ...

  4. Maven安装与环境配置(Windows)

    1.下载安装包 在Maven官网下载最新版的安装包:http://maven.apache.org/download.cgi 2.解压安装包 3.配置Maven环境变量 配置M2_HOME环境变量,指 ...

  5. pycharm设置pytest运行程序

  6. Individual Project "写一个能自动生成小学四则运算题目的程序"

    一.题目简介 写一个能自动生成小学四则运算题目的程序. 初步拟定要实现的功能后,估计一下自己需要花多长时间.编程过程中记录自己实际用了多长时间. 然后和同学们比较一下各自程序的功能.实现方法的异同等等 ...

  7. Linux awk使用方法~~整理

    目录 awk行处理方式 awk命令格式 命令行格式 脚本格式 命令行格式——基本格式 awk内置变量 awk内置函数 测试数据 awk变量和函数使用实例 逻辑判断式 扩展格式 BEGIN 和 END ...

  8. MySQL 5.7默认ONLY_FULL_GROUP_BY语义介绍

    mysql 5.7版本 出现 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corre ...

  9. 从零开始搭建VUE项目

    前言: 此样板面向大型,严肃的项目,并假定您对Webpack和vue-loader有些熟悉. 请务必阅读vue-loader的常见工作流配方的文档. 如果您只想尝试vue-loader或者鞭打一个快速 ...

  10. js 深度复制deepClone

    function isObject(obj) { return typeof obj === 'object' && obj != null; } const deepClone =( ...