第13章 xadmin的进阶开发

慕课网《强力django+杀手级xadmin 打造上线标准的在线教育平台》 学习笔记


本章主要内容:

  • 介绍xadmin更进阶的开发, 加深对xadmin的理解, 让整个后台管理系统完成更加细节的定制, 包括:
    1. userprofile的注册、
    2. 导航栏icon的修改 、
    3. django ueditor富文本编辑器的集成、
    4. xadmin的插件制作
    5. 本章会介绍一款excel的导入插件开发

卸载原来的User,注册UserProfile代替

from xadmin.plugins.auth import UserAdmin
from django.contrib.auth.models import User

xadmin.site.unregister(User)
xadmin.site.register(UserProfile, UserProfileAdmin)

或者在 xadmin.plugins.auth 中加入:

from django.contrib.auth import get_user_model
User = get_user_model()

同时,由于我们用UserProfile 替换了原来的User,所以还有一些地方需要修改,在 xadmin.plugins.auth最下面,将

site.register_view(r'^auth/user/(.+)/password/$',
                   ChangePasswordView, name='user_change_password')

修改为:

site.register_view(r'^users/userprofile/(.+)/password/$',
                   ChangePasswordView, name='user_change_password')

布局,定制

class UserAdmin(object):
    change_user_password_template = None
    list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')
    list_filter = ('is_staff', 'is_superuser', 'is_active')
    search_fields = ('username', 'first_name', 'last_name', 'email')
    ordering = ('username',)
    style_fields = {'user_permissions': 'm2m_transfer'}
    model_icon = 'fa fa-user'

    def get_form_layout(self):
        if self.org_obj:
            self.form_layout = (
                Main(
                    Fieldset('',
                             'username', 'password',
                             css_class='unsort no_title'
                             ),
                    Fieldset(_('Personal info'),
                             Row('first_name', 'last_name'),
                             'email'
                             ),
                    Fieldset(_('Permissions'),
                             'groups', 'user_permissions'
                             ),
                    Fieldset(_('Important dates'),
                             'last_login', 'date_joined'
                             ),
                ),
                Side(
                    Fieldset(_('Status'),
                             'is_active', 'is_staff', 'is_superuser',
                             ),
                )
            )
        return super(UserAdmin, self).get_form_layout()

这里写图片描述

这里写图片描述

权限的使用

Django默认为每一张表生成四种权限:增删改查

这里写图片描述

这里写图片描述

这里写图片描述

  • 用户拥有什么权限,就只能看到相应权限的界面

权限组

可以为组添加一些权限,然后再将用户加到组里
最终用户的权限为:所在组的所有权限 + 自己额外的权限

这里写图片描述

更改图标

这里写图片描述

这里写图片描述

图标是通过 model_icon 来配置的,可选的图标参考font awesome

font awesome : http://fontawesome.dashgame.com/

这里写图片描述

可以下载最新的awesome文件替换掉xadmin中的

 显示的排序

设置按照某些列进行排序显示
通过 ordering 来配置

这里写图片描述

这里写图片描述

  • 同时, readonly_fields 配置的字段 为 只读,不可编辑
  • exclude 的字段 则不会显示在编辑页面
  • readonly_fields 和 exclude 是冲突的,配置了 readonly_fields ,则exclude 是无效的

  • 外键可以设置为搜索的模式

inlineAdmin 嵌套编辑

class LessonInline(object):
    model = Lesson
    extra = 0

class CourseResourceInline(object):
    model = CourseResource
    extra = 0

class CourseAdmin(object):
    ……
    inlines = [LessonInline, CourseResourceInline]

这样就可以在编辑Course的时候同时对Lesson 和CourseResource 进行 增删查改

两个管理器管理一张数据表

在model.py中新增一个类,继承Course
proxy必须为True,这样Django就不会为BannerCourse新增一张数据表,而是和Course共用一张数据表

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

为它新增一个管理器
这里需要重载 queryset 方法进行过滤,这样就可以显示过滤后的数据

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]

    def queryset(self):
        qs = super(BannerCourseAdmin, self).queryset()
        qs = qs.filter(is_banner=True) # 过滤
        return qs

这里写图片描述

而原来的Course的管理器也进行过滤

    def queryset(self):
        qs = super(CourseAdmin, self).queryset()
        qs = qs.filter(is_banner=False)
        return qs

这样就可以将一张数据表分别显示

这里写图片描述

list_editable 中的字段可以显示页面单独编辑

这里写图片描述

  • 显示函数计算的结果,如显示章节数
    def get_zj_nums(self):
        #获取课程章节数
        return self.lesson_set.all().count()
    get_zj_nums.short_description = "章节数"

然后在list_display中加入get_zj_nums
这里写图片描述

  • 显示页插入自定义的html
    def go_to(self):
        from django.utils.safestring import mark_safe
        return mark_safe("<a href='http://www.projectsedu.com'>跳转</>")
    go_to.short_description = "跳转"

通过再把go_to添加到list_display中

就得到了跳转的超链接

  • refreshTime字段定义每几秒刷新页面一次

  • 重载save_models方法,在保存课程的时候统计课程机构的课程数

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

xadmin 的更多功能

这里写图片描述

根据自己需要,查看修改xadmin的源码

如插件:

这里写图片描述

开发自己的插件

xadmin插件开发:https://xadmin.readthedocs.io/en/latest/make_plugin.html
UEditor:http://ueditor.baidu.com/website/
Django-Ueditor:https://github.com/zhangfisher/DjangoUeditor

这里写图片描述

这里写图片描述

detail = UEditorField(verbose_name=u"课程详情",width=600, height=300, imagePath="courses/ueditor/", filePath="courses/ueditor/", default='')

总结使用富文本编辑器UEditor的步骤

这里写图片描述

前端显示,取消自动转义

<div class="tab_cont tab_cont1">
    {% autoescape off %}
    {{ course.detail }}
    {% endautoescape %}
</div>
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值