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 相关文章推荐
Python enumerate遍历数组示例应用
Sep 06 Python
使用python将mdb数据库文件导入postgresql数据库示例
Feb 17 Python
python3.6 实现AES加密的示例(pyCryptodome)
Jan 10 Python
TensorFlow实现MLP多层感知机模型
Mar 09 Python
Python 使用PIL numpy 实现拼接图片的示例
May 08 Python
python 自定义对象的打印方法
Jan 12 Python
python生成带有表格的图片实例
Feb 03 Python
Python脚本去除文件的只读性操作
Mar 05 Python
Python filter过滤器原理及实例应用
Aug 18 Python
python自动从arxiv下载paper的示例代码
Dec 05 Python
Python 的 f-string 可以连接字符串与数字的原因解析
Feb 20 Python
Python 读取千万级数据自动写入 MySQL 数据库
Jun 28 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仿ZOL分页类代码
2008/10/02 PHP
有关phpmailer的详细介绍及使用方法
2013/01/28 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
2019/10/08 PHP
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
2011/06/28 Javascript
重写javascript中window.confirm的行为
2012/10/21 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
jQuery中toggle()函数的使用实例
2015/04/17 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
2016/08/29 Javascript
解决vue 路由变化页面数据不刷新的问题
2018/03/13 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
layui输入框中只允许输入整数的实现方法
2019/09/18 Javascript
python实现2014火车票查询代码分享
2014/01/10 Python
Python os模块学习笔记
2015/06/21 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
Python requests模块实例用法
2019/02/11 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
Python 硬币兑换问题
2019/07/29 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
Python LMDB库的使用示例
2021/02/14 Python
html5应用缓存_动力节点Java学院整理
2017/07/13 HTML / CSS
HTML5新增元素如何兼容旧浏览器有哪些方法
2014/05/09 HTML / CSS
澳大利亚拥有最佳跳伞降落点和最好服务的跳伞项目运营商:Skydive Australia
2018/03/05 全球购物
以太网Ethernet IEEE802.3
2013/08/05 面试题
什么是继承
2013/12/07 面试题
音乐节策划方案
2014/06/09 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
angular异步验证器防抖实例详解
2022/03/31 Javascript