美文网首页网站开发python从入门到精通python 实战实验室
最新Django2.0.1在线教育零基础到上线教程(十三)

最新Django2.0.1在线教育零基础到上线教程(十三)

作者: 天涯明月笙 | 来源:发表于2018-02-09 20:50 被阅读1081次

    演示地址: http://mxonline.mtianyan.cn

    教程仓库地址1: https://github.com/mtianyan/DjangoGetStarted
    教程仓库地址2: https://github.com/mtianyan/Mxonline2
    教程仓库地址3: https://github.com/mtianyan/Mxonline3

    十三: xadmin进阶开发

    xadmin的进阶开发

    static目录问题。

    xadmin的static文件在自己的目录下所以我们找不到

    1- url下的static路由配置注释掉
    2- setting中的StaticRoot注释掉

    markmark
    from xadmin.plugins.auth import UserAdmin
    
    class UserProfileAdmin(UserAdmin):
        pass
    
    xadmin.site.register(UserProfile,UserProfileAdmin)
    
    from django.contrib.auth.models import User
    xadmin.site.unregister(User)
    

    点进UserProfileAdmin中可以看官方是怎么实现布局的,我们可以重载

    get_form_layout

    自定义的显示方式
    

    get_user_model 获取用户: User =

    django权限赋值方式:赋给用户。没一个表的增删改查。

    auth_permission 组权限

    自定义icon

    model_icon = 'fa fa-group'

    xadmin/static/xadmin/vendor/font-awesome

    官网下载然后替换css和font

    默认排序

    adminx中

        ordering = ['-click_nums']
        readonly_fields =['click_nums','fav_nums']
            exclude = ['fav_nums']
    

    两个字段是冲突的。

    下拉框搜索:

    relfield_style = 'fk-ajax'
    

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

    数据量过大时很有用

    inlines添加数据。

    在一个页面直接完成章节。

    # 课程直接添加章节
    class LessonInline(object):
        model = Lesson
        extra = 0
    
            # 课程直接添加章节
        inlines = [LessonInline]
    

    没法完成在章节中再嵌套视频
    但是可以有多个inline。在添加课程时添加课程资源

    一张表分两个model来管理

    class BannerCourse(Course):
        class Meta:
            verbose_name = "轮播课程"
            verbose_name_plural = verbose_name
            proxy = True
    
    

    设置proxy = true会具有model的功能,但不会生成表

    
    # Course的admin管理器
    class BannerCourseAdmin(object):
        list_display = [
            'name',
            'desc',
            'detail',
            'degree',
            'learn_times',
            'students']
        search_fields = ['name', 'desc', 'detail', 'degree', 'students']
        list_filter = [
            'name',
            'desc',
            'detail',
            'degree',
            'learn_times',
            'students']
        ordering = ['-click_nums']
        readonly_fields =['click_nums']
        exclude = ['fav_nums']
        # 课程直接添加章节
        inlines = [LessonInline,CourseResourceInline]
    # 将管理器与model进行注册关联
    xadmin.site.register(BannerCourse, BannerCourseAdmin)
    

    admin中重载queryset方法。

        # 过滤列表中的数据
        def queryset(self):
            qs = super(BannerCourseAdmin, self).queryset()
            qs = qs.filter(is_banner=True)
            return qs
        # 过滤列表中的数据
        def queryset(self):
            qs = super(CourseAdmin, self).queryset()
            qs = qs.filter(is_banner=False)
            return qs
    

    xamdin其他常见功能:

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

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

    自定义函数作为列

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

    显示自定义的html代码

          def go_to(self):
            from django.utils.safestring import mark_safe
            # 如果不mark safe。会对其进行转义
            return  mark_safe("<a href='http://blog.mtianyan.cn'>跳转</>")
        go_to.short_description = "跳转"
    
    

    xadmin的工具: refresh

    xadmin/plugins/refresh.py

    列表页定时刷新的工具

        refresh_times = [3,5]
    

    字段联动

    应用场景: 新增一门课程之后,courseorg的课程数+1

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

    不用在课程里面添加章节数。

    xadmin自行探究

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

    下载源码包

    添加插件使得可以识别ueditor field

    记得在init中注册。

    markmark markmark markmark

    关闭自动转义。

    导入excel

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

    adminx 文件中的变量覆盖插件内部变量。

    只需要重载block_top_toolbar,就会把这个放到页面里面
    默认使用bootstrap

    init确定是否启用插件,

        def post(self, request, *args , **kwargs):
            if 'excel' in request.FILES:
                pass
    

    adminx中重写post方法。上传文件会被放在request.FILES中。

    中间pass步骤不管做什么事情,都要最后return父类的

    return super(CourseAdmin, self).post(request, args, kwargs)
    

    相关文章

      网友评论

      • 大壶:楼主你好,relfield_style = 'fk-ajax'这句在django2+xadmin环境下不起作用吗?
        我看到你在Mxonline3中的代码也没有
        天涯明月笙:@大壶 ∠(`ω´*)敬礼,厉害了,贴个代码地址供后来者学习吧。
        大壶:@天涯明月笙 我已经改好了,是xadmin升级到django2后的问题,需要修改源代码文件edit.py和relfield.py
        天涯明月笙:@大壶 这个不太清楚你网上找找,xadmin进阶开发那章中的小代码段过多,我就只做了django1版本的。
      • 7094bba22da4:很懵逼的一节,完全不知道要修改的代码在哪个位置:dizzy_face:
        7094bba22da4:@天涯明月笙 :sweat:
        天涯明月笙:@Bugyou ╭( ′• o •′ )╭☞就是这个人!没事没事,这些都是零零散散的一些鸡肋功能。需要定制了再去查
      • 哈哈哈_b4e9:你好楼主,导入excel。django2.0 xadmin-django2的环境下成了吗?
        看了一下github上各个django版本的,1.10开始render_to_stringj就变了,excel这个用不了。
        看imooc上说更新刀了3.6+django1.11,不知道是不是后面有视频讲解过修改excel呢?我看的视频只到14集
        gytlgac:@JING_80f8 去掉会导致csrf的问题,大家有什么好的解决办法没
        JING_80f8:django2.0 xadmin-django2的环境下导入excel时只需把context_instance=context去掉就行了
        def block_top_toolbar(self, context, nodes):
        nodes.append(loader.render_to_string('xadmin/excel/model_list.top_toolbar.import.html'))
        天涯明月笙:@哈哈哈_b4e9 官方的视频也没有讲更新版本的excel.我的mxonline3暂时没有做这个。mxonline2的也只是尝试了一下,并不完善。等有时间和需求了我会试着做下的。

      本文标题:最新Django2.0.1在线教育零基础到上线教程(十三)

      本文链接:https://www.haomeiwen.com/subject/nweqtftx.html