xadmin

作者: butters001 | 来源:发表于2018-11-09 14:37 被阅读0次

    1 Xadmin介绍

    直接替换掉Django自带的admin系统,并提供了很多有用的东西;完全的可扩展的插件支持,基于Twitter Bootstrap的漂亮UI。

    2 Xadmin特点

    • 完全替代Django admin
    • 支持基于Twitter Bootstrap的UI主题
    • 支持可扩展的插件
    • 更好的过滤器,日期范围,数量范围等
    • 内置xls,csv,xml和json格式数据导出
    • 仪表板页面和小部件支持 (暂时用不到)
    • 现场书签
    • 完整的CURD方法(增删改查)

    3 Xadmin的安装

    安装Xadmin
    pip install django-xadmin
    如果xadmin运行报错:卸载,换下面的安装方法,可能有点慢
    pip install git+git://github.com/sshwsfc/xadmin.git
    for Django 2.0:
    pip install git+git://github.com/sshwsfc/xadmin.git@django2

    安装依赖项

    django-crispy-forms
    django-import-export
    django-reversion
    django-formtools
    future
    httplib2
    six
    

    4 Xadmin的基本配置

    4.1 settings.py配置

    (1) INSTALLED_APPS(注册app)添加 ‘xadmin’ 和 ‘crispy_forms‘两项
    (2) 后台管理页面的汉化与时间

     LANGUAGE_CODE = 'zh-Hans'
    TIME_ZONE = 'Asia/Shanghai'
    
    4.2 urls.py配置

    (1) 注释掉系统自带的admin
    # url(r'^admin/', admin.site.urls)

    (2) 导入xadmin,添加

    import xadmin
    
    url(r'^xadmin/', xadmin.site.urls)
    
    4.3 admin.py全局配置
    from xadmin import views
    
    class GlobalSetting(object):
    
        site_title = "xxx后台管理系统"
        site_footer = "北京xxx信息科技有限公司"
    
        # menu_style = "accordion" # 左侧选项列表出现拉伸效果,可折叠
    
    xadmin.site.register(views.CommAdminView, GlobalSetting)
    
    image.png

    5 Xadmin的基本使用

    xadmin与Django自带的admin应用有许多相似之处。都有许多options用以丰富自定义界面。

    这里以官网的后台管理为例,介绍xadmin的使用。

    (1) 首先定义模型类models.py
     class Signup(models.Model):
    
         username = models.CharField('用户名', max_length=255)
         phone = models.CharField('手机号', max_length=255)
         email = models.EmailField('邮箱', max_length=255)
         company = models.CharField('公司名称', max_length=255)
         create_time = models.DateTimeField('创建时间', null=True, blank=True)
         isdelete = models.BooleanField('激活', default=True)
    
         # admin管理界面中显示中文model名称
         class Meta:
         verbose_name = '注册用户'
         verbose_name_plural = '注册用户'
    
         # 添加删除是不再显示Signup onject,而是显示__str__返回的内容
         def __str__(self):
             return self.username
    
    (2) 定义Admin管理类并注册 admin.py
     import xadmin
     from myapp.models import Signup
    
     # 定义Admin管理类
     class SignupAdmin(object):
    
         # 制定action
         actions = [MyAction, ]
    
         # options选项:
         # 1. 注册用户列表页都显示哪些字段
         list_display = ('username', 'company', 'create_time', 'isdelete', 'email')
    
         # 2. 列表页过滤器
         list_filter = ('company', 'isdelete', 'create_time')
    
         # 3. 列表页每页显示几个
         list_per_page = 20
    
         # 4. 注意search_fields里不能出现以时间定义的字段,如Date,DateTime等
         search_fields = ['username', 'email', 'company', 'phone']
    
         # 5. 这些字段可以点击显示详细信息
         show_detail_fields = ['username']
    
         # 6. 这些字段可以在列表页即时数据编辑,不用进change页面去编辑,ajax无刷新
         list_editable = ['isdelete']
    
         # 7. change页只能读取不能更改的数据
         # readonly_fields = ['username']
    
    (3) 自定义Action admin.py

    上一步骤中出现了actions = [MyAction, ],这里可以自定义action动作。
    系统默认会有一个 '删除所选的xxx' 操作动作,这里我们添加一个 '批量更改选中用户的激活' 操作。效果如图:


    image.png
    # 自定义Action
    
    from xadmin.plugins.actions import BaseActionView
    
    class MyAction(BaseActionView):
    
         # 这里需要填写三个属性
         # 1. 相当于这个 Action 的唯一标示, 尽量用比较针对性的名字
         action_name = "my_action"
         # 2. 描述, 出现在 Action 菜单中,   
         description = (u'更改用户的激活状态')
         # 3. 该 Action 所需权限
         model_perm = 'change'
    
         # 而后实现 do_action 方法
         def do_action(self, queryset):
             # queryset 是包含了已经选择的数据的 queryset
             for obj in queryset:
             # 这里对每一个object对象的激活状态取反并保存到数据库,激活的改成未激活,# 未激活的变成激活状态
                 obj.isdelete = not(obj.isdelete)
                 obj.save()
             # 返回 HttpResponse
             return
    # 定义好Action动作,添加到Admin的action属性中
    

    6 Xadmin插件

    6.1 插件原理

    Xadmin 的插件系统架构设计一定程度上借鉴了 wordpress 的设计。 想要了解 Xadmin 的插件系统架构首先需要了解 XadminAdminView 的概念。 简单来说,就是 Xadmin 系统中每一个页面都是一个 AdminView 对象返回的 HttpResponse 结果。Xadmin 的插件系统做的事情其实就是在 AdminView运行过程中改变其执行的逻辑, 或是改变其返回的结果,起到修改或增强原有功能的效果。下面让我们看看整个插件从制作完成到实际运行的整个过程。

    6.2 自定义插件

    自定义插件主要是为了改变系统的运行逻辑及结果
    这里以chang页面的删除为例,当删除对象时,改变默认的数据库日志的message数据。admin.py

    1. 自定义插件类,继承BaseAdminPlugin
    from xadmin.views import BaseAdminPlugin, DeleteAdminView
    
    # 自定义插件类
    
    class LogPlugin(BaseAdminPlugin):
         # 根据返回值判断是否启动该插件
         def init_request(self, *args, **kwargs):
             object_id = self.args[0]
             model = self.model
    
             # 获取obj信息不能写在下面的delete_model, 下面已经删完了获取不到的,
             # 所以message也要在这里定义
             # 根据model获取到要删除的模型实例对象,添加到self中供delete_model调用
             self.obj = model.objects.filter(id=object_id)
             self.message = '删除了 %s' % list((self.obj.values()))
             return True
    
         # 重写xadmin自带的delete_model方法,这里主要修改了log函数的第二个参数(message)
        def delete_model(self):
            self.log('delete', self.message, self.obj)
            self.obj.delete()
    
    # 自定义插件后,注册插件
    xadmin.site.register_plugin(LogPlugin, DeleteAdminView)
    
    1. 插件开发

    因为插件是继承 BaseAdminPlugin 类,而该类继承自 BaseAdminObject, 所以这两个类的方法都可以在插件中使用。

    Xadmin 在创建插件时会自动注入以下属性到插件实例中:
    - request : Http Request
    - user : 当前 User 对象
    - args : View 方法的 args 参数
    - kwargs : View 方法的 kwargs 参数
    - admin_view : AdminView 实例
    - admin_site : Xadmin 的 admin_site 对象实例
    
    如果 AdminView 是 ModelAdminView 的子类,还会自动注入以下属性:
    - model : Model 对象
    - opts : Model 的 _meta 属性
    
    接下来应该考虑打算制作什么功能的插件了。不同功能的插件额能需要注册到不同的 AdminView上,Xadmin 系统中主要的 AdminView 有:
    
    BaseAdminView: 所有 AdminView 的基础类,注册在该 View 上的插件可以影响所有的 AdminView
    CommAdminView: 用户已经登陆后显示的 View,也是所有登陆后 View 的基础类。该 View主要作用是创建了 Xadmin 的通用元素,例如:系统菜单,用户信息等。插件可以通过注册该 View 来修改这些信息。
    ModelAdminView: 基于 Model 的 AdminView 的基础类,注册的插件可以影响所有基于 Model 的 View。
    ListAdminView: Model 列表页面 View。
    ModelFormAdminView: Model 编辑页面 View。
    CreateAdminView: Model 创建页面 View。
    UpdateAdminView: Model 修改页面 View。
    DeleteAdminView: Model 删除页面 View。
    DetailAdminView: Model 详情页面 View。
    
    选择好目标 AdminView 后就要在自己的插件中编写方法来修改或增强这些 AdminView 。其中每个 AdminView 可以拦截的方法及其介绍请参看各 AdminView 的文档。http://xadmin.readthedocs.io/en/docs-chinese/views_api.html
    
    xadmin源码中被 filter_hook() 装饰的方法都可以被插件截获或修改。
    

    相关文章

      网友评论

        本文标题:xadmin

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