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 isinstance判断对象类型
Sep 06 Python
python抓取京东商城手机列表url实例代码
Dec 18 Python
在Python中使用matplotlib模块绘制数据图的示例
May 04 Python
解析Python中的二进制位运算符
May 13 Python
利用python爬取软考试题之ip自动代理
Mar 28 Python
Django中的文件的上传的几种方式
Jul 23 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
基于Python测试程序是否有错误
May 16 Python
Pycharm中配置远程Docker运行环境的教程图解
Jun 11 Python
浅谈tensorflow 中的图片读取和裁剪方式
Jun 30 Python
python实现语音常用度量方法的代码详解
May 25 Python
Python+pyaudio实现音频控制示例详解
Jul 23 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的输入输出流
2007/02/14 PHP
PHP去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
php 无限级 SelectTree 类
2009/05/19 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
php多次include后导致全局变量global失效的解决方法
2015/02/28 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
Gambit vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
使用jquery写个更改表格行顺序的小功能
2014/04/29 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
JavaScript设计模式经典之工厂模式
2016/02/24 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
Bootstrap导航简单实现代码
2017/03/06 Javascript
微信小程序 下拉菜单的实现
2017/04/06 Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
2017/09/18 jQuery
vue组件父与子通信详解(一)
2017/11/07 Javascript
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
JavaScript 获取滚动条位置并将页面滑动到锚点
2021/02/08 Javascript
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
Win10下Python环境搭建与配置教程
2016/11/18 Python
pytorch cnn 识别手写的字实现自建图片数据
2018/05/20 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
python多任务之协程的使用详解
2019/08/26 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
python 最简单的实现适配器设计模式的示例
2020/06/30 Python
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
现代绅士日常奢侈品:Todd Snyder
2019/12/13 全球购物
大型晚会策划方案
2014/02/06 职场文书
管事部库房保管员岗位职责
2014/02/21 职场文书
2014年信访维稳工作总结
2014/12/08 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
2015年银行柜员工作总结报告
2015/04/01 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
《语言的突破》读后感3篇
2019/12/12 职场文书