django xadmin action兼容自定义model权限教程


Posted in Python onMarch 30, 2020

如标题。最近在研究xadmin,发现文档确实比较少,自己只能连滚带爬~

起因

因为想做一个审批的功能,用xadmin acrtion来实现。本来想用模块现有“change”字段控制权限,但是发现使用“change”字段控制权限的话,会把自带的 “delete” action 暴露出来,这不是我想要的。 所以在模块里添加了一个“approver”字段,用以控制权限。

代码

首先修改模块的 “Meta”,增加权限字段。

class TaskApprove(Task):
  class Meta:
    proxy = True
    verbose_name = u'审批'
    verbose_name_plural = verbose_name
    permissions = (
      ("approve","审批:用户任务"),
    )

然后刷新一下数据库,会在用户管理的界面中看到我们新加的权限。

接下来在adminx.py中创建自己的action,并在你的管理类中添加。

from xadmin.plugins.actions import BaseActionView
class MyAction(BaseActionView):
  action_name = u'accept'
  model_perm = 'approve'
  description = '同意'
  def do_action(self, queryset):
    for obj in queryset:
      ##你的操作
      print(obj)
    return HttpResponse('您已同意')
class TaskApproveSettings(ViewOnlyMixin):
  actions = [MyAction,]
  list_display = ['name','targets','services','create_by']
xadmin.site.register(TaskApprove,TaskApproveSettings)

下面是重点, 因为xadmin中的权限检测是写死的 只有 “view\change\delete\add”,而我们添加了一个“approve字段”, 这会导致报错 ? “keyerro” 。 所以接下来我们覆盖一下xadmin中的方法,添加一个方法。

* 不知道为什么前几次以继承覆盖的方式没有成功~~*

在控制类TaskApproveSettings中添加。

首先添加一个方法,用来获取是否有权限

def has_approve_permission(self):
  codename = get_permission_codename('approve', self.opts)
  return ('approve' not in self.remove_permissions) and self.user.has_perm('%s.%s' % (self.app_label, codename))

接下来修改get_model_perms 方法,将我们的权限添加进去

def get_model_perms(self):
    """
    Returns a dict of all perms for this model. This dict has the keys
    ``add``, ``change``, and ``delete`` mapping to the True/False for each
    of those actions.
    """
    return {
      'view': self.has_view_permission(),
      'add': self.has_add_permission(),
      'change': self.has_change_permission(),
      'delete': self.has_delete_permission(),
      'approve': self.has_approve_permission()
    }

最后是这样的

from xadmin.plugins.actions import BaseActionView
from django.shortcuts import HttpResponse
from django.contrib.auth import get_permission_codename
class ActionApproveAccept(BaseActionView):
  action_name = u'accept'
  model_perm = 'approve'
  description = '同意'
  global_actions = []
  def do_action(self, queryset):
    for obj in queryset:
      print(obj)
    return HttpResponse('您已同意')

class ActionApproveReject(BaseActionView):
  action_name = u'reject'
  model_perm = 'approve'
  description = '拒绝'
  global_actions = []
  def do_action(self, queryset):
    for obj in queryset:
      print(obj)
    return HttpResponse('您已拒绝')
class TaskApproveSettings(ViewOnlyMixin):
  actions = [ActionApproveAccept,ActionApproveReject]

  list_display = ['name','targets','services','create_by']
  readonly_fields = TaskFields.create+TaskFields.params+TaskFields.approve
  form_layout = (
    Main(
      Fieldset('',
           *TaskFields.create,
           css_class='unsort no_title'
           ),

      Fieldset(('参数'),
           *TaskFields.params
           ),
    ),
    Side(
      Fieldset(('审批状态'),
           *TaskFields.approve
           ),
    )
  )
  def get_model_perms(self):
    return {
      'view': self.has_view_permission(),
      'add': self.has_add_permission(),
      'change': self.has_change_permission(),
      'delete': self.has_delete_permission(),
      'approve': self.has_approve_permission()
    }
  def has_approve_permission(self):
    codename = get_permission_codename('approve', self.opts)
    return ('approve' not in self.remove_permissions) and self.user.has_perm('%s.%s' % (self.app_label, codename))

重启服务就好啦!

我仅做了目前这些,暂时没有发现问题。如果后面发现问题我会继续补充,另外大家如果有更好的方法,欢迎留言纠正~!

补充知识:Dajngo 通过代码添加xadmin用户和权限(组)

在开发的时候,用户要求在认证的时候自动添加xadmin登录账户和分配组权限

from django.contrib.auth.models import Group,User
from django.http import JsonResponse
def test(req):
  name=req.POST['name']
  account=req.POST['account']
  password=req.POST['password']
  an=Group.objects.filter(id=1).first() #二级管理组 是管理员在xadmin后台添加的权限组
  user = User(username=account)
  user.set_password(password)
  user.is_superuser = False
  user.is_active = True
  user.first_name = name
  user.is_staff = True
  user.save() #先生成用户
  user.groups.add(an)
  return JsonResponse({'ret':0,'msg':'success'})

以上这篇django xadmin action兼容自定义model权限教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Pyramid Mako模板引入helper对象的步骤方法
Nov 27 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 Python
Python画图学习入门教程
Jul 01 Python
Python字典及字典基本操作方法详解
Jan 30 Python
Django model序列化为json的方法示例
Oct 16 Python
使用Python获取网段IP个数以及地址清单的方法
Nov 01 Python
解决Python下json.loads()中文字符出错的问题
Dec 19 Python
python进阶之自定义可迭代的类
Aug 20 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
Apr 15 Python
python各种excel写入方式的速度对比
Nov 10 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
Jan 07 Python
Python经常使用的一些内置函数
Apr 11 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
Mar 30 #Python
Django admin 实现search_fields精确查询实例
Mar 30 #Python
Django模型中字段属性choice使用说明
Mar 30 #Python
Django+python服务器部署与环境部署教程详解
Mar 30 #Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
Mar 30 #Python
django自定义非主键自增字段类型详解(auto increment field)
Mar 30 #Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
Mar 30 #Python
You might like
关于php支持分块与断点续传文件下载功能代码
2014/05/09 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
JQuery autocomplete 使用手册
2010/04/01 Javascript
javascript天然的迭代器
2010/10/29 Javascript
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
Vue分页器实现原理详解
2019/06/28 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
原生js实现文件上传、下载、封装等实例方法
2020/01/05 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
Python实现在Linux系统下更改当前进程运行用户
2015/02/04 Python
Python计算斗牛游戏概率算法实例分析
2017/09/26 Python
python实现简单图片物体标注工具
2019/03/18 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
Series和DataFrame使用简单入门
2019/11/13 Python
Django 路由层URLconf的实现
2019/12/30 Python
Python内置异常类型全面汇总
2020/05/28 Python
anaconda3安装及jupyter环境配置全教程
2020/08/24 Python
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
斯凯奇新西兰官网:SKECHERS新西兰
2018/02/22 全球购物
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
WebSphere面试题:在WebSphere里面如何部署一个应用
2015/08/02 面试题
秋季运动会广播稿大全
2014/02/17 职场文书
小学数学教研活动总结
2014/07/01 职场文书
乡镇安全生产目标责任书
2014/07/23 职场文书
2016年会开场白台词
2015/06/01 职场文书
省级三好学生主要事迹材料
2015/11/03 职场文书
2019年警察入党转正申请书最新范文
2019/09/03 职场文书
Python中三种花式打印的示例详解
2022/03/19 Python