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中使用判断语句和循环的教程
Apr 25 Python
python 中split 和 strip的实例详解
Jul 12 Python
详解如何利用Cython为Python代码加速
Jan 27 Python
Python迭代器和生成器定义与用法示例
Feb 10 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
Python基本socket通信控制操作示例
Jan 30 Python
Python中文编码知识点
Feb 18 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
Django3.0 异步通信初体验(小结)
Dec 04 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
Jan 20 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
Apr 29 Python
如何利用Python动态模拟太阳系运转
Sep 04 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
2020最新CPU的性能排名
2020/04/02 数码科技
弄了个检测传输的参数是否为数字的Function
2006/12/06 PHP
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
PHP的范围解析操作符(::)的含义分析说明
2011/07/03 PHP
php用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
Yii2 rbac权限控制操作步骤实例教程
2016/04/29 PHP
php实现数字补零的方法总结
2018/09/12 PHP
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
JavaScript中for循环的使用详解
2015/06/03 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
Nodejs中 npm常用命令详解
2016/07/04 NodeJs
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
详解关于Vue版本不匹配问题(Vue packages version mismatch)
2018/09/17 Javascript
详解Element-UI中上传的文件前端处理
2019/08/07 Javascript
Python实现文件复制删除
2016/04/19 Python
python爬取51job中hr的邮箱
2016/05/14 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
python实现七段数码管和倒计时效果
2019/11/23 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
2020/06/02 Python
numpy实现RNN原理实现
2021/03/02 Python
做一个能自适应高度的textarea的示例代码
2019/09/06 HTML / CSS
CheapTickets香港机票预订网站:CheapTickets.hk
2019/06/26 全球购物
Java程序员常见面试题
2015/07/16 面试题
《诺贝尔》教学反思
2014/02/17 职场文书
主题教育活动总结
2014/05/05 职场文书
自习课吵闹检讨书范文
2014/09/26 职场文书
成本会计实训报告
2014/11/05 职场文书
2015年校本培训工作总结
2015/07/24 职场文书
社会心理学学习心得体会
2016/01/22 职场文书
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS