前言
Action插件在数据列表页面上提供数据选择功能。可以在Action之后专门处理所选数据。批量删除功能作为默认操作提供。
action文档
要启用Action,开发人员可以设置Model OptionClass的属性“actions”,这是一种列表类型。xadmin官方文档地址https://xadmin.readthedocs.io/en/latest/plugins.html
默认情况下,xadmin已启用DeleteSelectedAction,它提供了从列表视图中删除所选项目的选项。您还可以实现自定义的Action类,请参阅以下示例。
首先需要一个Action类,它是BaseActionView的子类。BaseActionView是以下的子类ModelAdminView:
from xadmin.plugins.actions import BaseActionView
class MyAction(BaseActionView):
action_name = "my_action" #: 相当于这个 Action 的唯一标示, 尽量用比较针对性的名字
description = _(u'Test selected %(verbose_name_plural)s') #: 描述, 出现在 Action 菜单中, 可以使用 ``%(verbose_name_plural)s`` 代替 Model 的名字.
model_perm = 'change' #: 该 Action 所需权限
# 而后实现 do_action 方法
def do_action(self, queryset):
# queryset 是包含了已经选择的数据的 queryset
for obj in queryset:
# obj 的操作
...
# 返回 HttpResponse
return HttpResponse(...)
然后在Model中的OptionClass上应用此Action
class MyModelAdmin(object):
actions = [MyAction, ]
案例操作
接下来有个需求:在Student列表页,我需要勾选不同的项,实现清空学生成绩的操作
在adminx.py同一目录新建一个adminx_actions.py文件
- action_name 这个Action的唯一标示
- description 出现在 Action 菜单中名称
- model_perm 该 Action 所需权限, 总共四种(‘add', 'change', 'delete', 'view‘)
- icon 显示图标
- do_action 执行的动作
# adminx_actions.py
from django.http import HttpResponse
from xadmin.plugins.actions import BaseActionView
class ClearAction(BaseActionView):
'''清空action'''
action_name = "clear_score" # 相当于这个Action的唯一标示, 尽量用比较针对性的名字
description = u'清空成绩 %(verbose_name_plural)s' # 出现在 Action 菜单中名称
model_perm = 'change' # 该 Action 所需权限
icon = 'fa fa-bug'
# 执行的动作
def do_action(self, queryset):
for obj in queryset:
# 需执行model对应的字段
obj.score = '0' # 重置score为0
obj.save()
# return HttpResponse
return None # 返回的url地址
接下来在adminx.py注册表的时候添加一项actions=[ClearAction,]
# adminx.py
import xadmin
from .models import Student
from .xadmin_action import ClearAction
class ControlStudent(object):
# 显示的字段
list_display = ['student_id', 'name', 'age', 'score',]
# 搜索条件
search_fields = ('name',)
# 每页显示10条
list_per_page = 10
actions = [ClearAction, ]
xadmin.site.register(Student, ControlStudent)
实现效果
打开学生表列表页,勾选需要清除的行,左下角执行动作里面有个“清除成绩的选项”
点击后页面会自动刷新,成绩变成0