转载

xadmin

2018-11-09  本文已影响0人  butters001

1 Xadmin介绍

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

2 Xadmin特点

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() 装饰的方法都可以被插件截获或修改。
上一篇 下一篇

猜你喜欢

热点阅读