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 相关文章推荐
浅谈对yield的初步理解
May 29 Python
python 连接各类主流数据库的实例代码
Jan 30 Python
Python 使用PIL中的resize进行缩放的实例讲解
Aug 03 Python
浅谈django rest jwt vue 跨域问题
Oct 26 Python
python3 面向对象__类的内置属性与方法的实例代码
Nov 09 Python
对python pandas 画移动平均线的方法详解
Nov 28 Python
numpy.random模块用法总结
May 27 Python
Python爬虫requests库多种用法实例
May 28 Python
python爬虫中PhantomJS加载页面的实例方法
Nov 12 Python
Python用摘要算法生成token及检验token的示例代码
Dec 01 Python
selenium判断元素是否存在的两种方法小结
Dec 07 Python
python中如何对多变量连续赋值
Jun 03 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数组函数序列之in_array() - 查找数组中是否存在指定值
2011/11/07 PHP
php变量作用域的深入解析
2013/06/03 PHP
php生成短域名函数
2015/03/23 PHP
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
js中有关IE版本检测
2012/01/04 Javascript
javascript表单验证使用示例(javascript验证邮箱)
2014/01/07 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
2016/05/12 Javascript
总结JavaScript设计模式编程中的享元模式使用
2016/05/21 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
angularjs实现搜索的关键字在正文中高亮出来
2017/06/13 Javascript
微信小程序自定义弹窗wcPop插件
2018/11/19 Javascript
JavaScript实现的联动菜单特效示例
2019/07/08 Javascript
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
Python中使用不同编码读写txt文件详解
2015/05/28 Python
更改Ubuntu默认python版本的两种方法python-> Anaconda
2016/12/18 Python
简述Python2与Python3的不同点
2018/01/21 Python
Python实现简易版的Web服务器(推荐)
2018/01/29 Python
python开发一个解析protobuf文件的简单编译器
2020/11/17 Python
HTML5 canvas画矩形时出现边框样式不一致的解决方法
2013/10/14 HTML / CSS
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
如何打开WebSphere远程debug
2014/10/10 面试题
岳父生日宴会答谢词
2014/01/13 职场文书
争论的故事教学反思
2014/02/06 职场文书
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
计算机专业应届生求职信
2014/04/06 职场文书
一位农村小子的自荐信
2014/04/07 职场文书
英语故事演讲稿
2014/04/29 职场文书
工伤劳动仲裁代理词
2015/05/25 职场文书
难以忽视的真相观后感
2015/06/05 职场文书
遗嘱格式范本
2015/08/07 职场文书
全国劳模先进事迹材料(2016精选版)
2016/02/25 职场文书
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android