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编码最佳实践之总结
Feb 14 Python
Django实现的自定义访问日志模块示例
Jun 23 Python
Python使用pyh生成HTML文档的方法示例
Mar 10 Python
python 对象和json互相转换方法
Mar 22 Python
在unittest中使用 logging 模块记录测试数据的方法
Nov 30 Python
python scatter散点图用循环分类法加图例
Mar 19 Python
python dlib人脸识别代码实例
Apr 04 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
May 15 Python
python实现AdaBoost算法的示例
Oct 03 Python
python通用数据库操作工具 pydbclib的使用简介
Dec 21 Python
python 统计代码耗时的几种方法分享
Apr 02 Python
Python实现聚类K-means算法详解
Jul 15 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判断用户是否手机访问代码
2015/06/08 PHP
php实现图片上传并进行替换操作
2016/03/15 PHP
PHP设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
jquery之empty()与remove()区别说明
2010/09/10 Javascript
Jquery 实现table样式的设定
2015/01/28 Javascript
JavaScript模拟push
2016/03/06 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
简单实现Bootstrap标签页
2020/08/09 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
vue.js,ajax渲染页面的实例
2018/02/11 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
2018/03/10 Javascript
详解组件库的webpack构建速度优化
2018/06/18 Javascript
vue结合axios与后端进行ajax交互的方法
2018/07/06 Javascript
chosen实现省市区三级联动
2018/08/16 Javascript
vue 指令之气泡提示效果的实现代码
2018/10/18 Javascript
jQuery访问json文件中数据的方法示例
2019/01/28 jQuery
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python strip lstrip rstrip使用方法
2008/09/06 Python
python自定义解析简单xml格式文件的方法
2015/05/11 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
美国猫狗药物和用品网站:PetCareRx
2017/01/05 全球购物
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
文明村创建实施方案
2014/03/27 职场文书
初中优秀教师事迹材料
2014/08/18 职场文书
2015年小学美术工作总结
2015/05/25 职场文书
Python基于百度API识别并提取图片中文字
2021/06/27 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python