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脚本来实现最简单的FTP下载的教程
May 04 Python
Python中字典映射类型的学习教程
Aug 20 Python
Python2.x版本中基本的中文编码问题解决
Oct 12 Python
Python3 中文文件读写方法
Jan 23 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
Apr 18 Python
Selenium 模拟浏览器动态加载页面的实现方法
May 16 Python
python批量从es取数据的方法(文档数超过10000)
Dec 27 Python
python爬虫之验证码篇3-滑动验证码识别技术
Apr 11 Python
python 根据字典的键值进行排序的方法
Jul 24 Python
OpenCV+python实现实时目标检测功能
Jun 24 Python
python 中的命名空间,你真的了解吗?
Aug 19 Python
python+pytest接口自动化之token关联登录的实现
Apr 06 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
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
2008/03/22 Javascript
js身份证验证超强脚本
2008/10/26 Javascript
XENON基于JSON变种
2010/07/27 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
在Ubuntu上安装最新版本的Node.js
2014/07/14 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
AngularJS 中的事件详解
2016/07/28 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
JS 封装父页面子页面交互接口的实例代码
2019/06/25 Javascript
python数据结构之二叉树的统计与转换实例
2014/04/29 Python
Django自定义分页与bootstrap分页结合
2021/02/22 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
Django 导出 Excel 代码的实例详解
2017/08/11 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
Python 2种方法求某个范围内的所有素数(质数)
2020/01/31 Python
Django Auth用户认证组件实现代码
2020/10/13 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
Python之Sklearn使用入门教程
2021/02/19 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
韩国女装NO.1网店:STYLENANDA
2016/09/16 全球购物
全球最大最受欢迎的旅游社区:Tripadvisor
2017/11/03 全球购物
Cinque网上商店:德国服装品牌
2019/03/17 全球购物
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
京剧自荐信
2014/01/26 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
企业授权委托书范本
2014/09/22 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
2015年端午节活动总结
2015/02/11 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书
详解PHP设计模式之依赖注入模式
2021/05/25 PHP