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
- 自定义插件类,继承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)
- 插件开发
因为插件是继承 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() 装饰的方法都可以被插件截获或修改。
网友评论