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进阶教程之循环相关函数range、enumerate、zip
Aug 30 Python
Python实现的摇骰子猜大小功能小游戏示例
Dec 18 Python
python批量导入数据进Elasticsearch的实例
May 30 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
Nov 14 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
python调用函数、类和文件操作简单实例总结
Nov 29 Python
Python识别html主要文本框过程解析
Feb 18 Python
Python grequests模块使用场景及代码实例
Aug 10 Python
java字符串格式化输出实例讲解
Jan 06 Python
termux中matplotlib无法显示中文问题的解决方法
Jan 11 Python
粗暴解决CUDA out of memory的问题
May 22 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
VFP与其他应用程序的集成
2006/10/09 PHP
NO3第三帝国留言簿制作过程
2006/10/09 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
2013/04/26 PHP
PHP中if和or运行效率对比
2014/12/12 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
Laravel配合jwt使用的方法实例
2020/10/25 PHP
document.all与WEB标准
2020/05/13 Javascript
鼠标经过的文本框textbox变色
2009/05/21 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
javascript实现数字倒计时特效
2016/03/30 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
2016/06/15 Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
2017/09/29 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
Vue的watch和computed方法的使用及区别介绍
2018/09/06 Javascript
vue slots 组件的组合/分发实例
2018/09/06 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
三种Webpack打包方式(小结)
2018/09/19 Javascript
Vue formData实现图片上传
2019/08/20 Javascript
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
[01:45]DOTA2新英雄“神谕者”全方位展示
2014/11/21 DOTA
[12:29]2018国际邀请赛 开幕秀
2018/08/22 DOTA
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
Python3实现带附件的定时发送邮件功能
2020/12/22 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
python如何随机生成高强度密码
2020/08/19 Python
python中altair可视化库实例用法
2021/01/26 Python
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
办公室人员先进事迹
2014/01/27 职场文书
翻译学院毕业生自荐书
2014/02/02 职场文书
幽默自我介绍演讲稿
2014/08/21 职场文书