Django-xadmin+rule对象级权限的实现方式

下面我将为您讲解“Django-xadmin+rule对象级权限的实现方式”的完整攻略。

1. 什么是Django-xadmin

xadmin是一个基于Django的后台管理系统,它提供了一系列方便的功能,可以极大地帮助我们快速地搭建后台管理系统。

2. 什么是rule对象级权限

Django中的权限和认证机制已经非常完善了,但是它只能区分用户是否有某个权限,而对于用户所在的组、部门或者行政级别之间的权限控制就需要我们自己来实现。对象级权限就是基于Django的权限和认证机制之上来进行更为细致的权限控制。

3. Django-xadmin+rule对象级权限的实现方式

3.1 安装xadmin

使用pip命令安装:

pip install django-xadmin==2.0.1

3.2 配置xadmin

在Django项目的settings.py文件中添加如下配置:

INSTALLED_APPS = [
    # ...
    'xadmin',
    'crispy_forms',
    # ...
]

# 添加xadmin的配置
import xadmin
xadmin.autodiscover()

# 修改默认的后台管理模板为xadmin的模板
from django.views.generic import TemplateView
urlpatterns = [
    # ...
    url(r'^xadmin/', xadmin.site.urls),
    url(r'^$', TemplateView.as_view(template_name='index.html'), name='index'),
    # ...
]

3.3 在model中定义规则

在Django的model中加入权限控制分组(group),然后加入每个分组的权限(rule),在添加和编辑时用FieldList实现:

class RuleGroup(models.Model):
    name = models.CharField(max_length=50, verbose_name='权限组名称')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '权限组'
        verbose_name_plural = verbose_name


class Rule(models.Model):
    group = models.ForeignKey(RuleGroup, verbose_name='权限组', on_delete=models.CASCADE)
    name = models.CharField(max_length=50, verbose_name='权限名称')
    codename = models.CharField(max_length=255, verbose_name='权限编码_permission')
    url = models.CharField(max_length=255, verbose_name='URL')
    icon = models.CharField(max_length=50, verbose_name='图标', blank=True, null=True)
    is_active = models.BooleanField(default=False, verbose_name='是否可用')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '权限'
        verbose_name_plural = verbose_name

3.4 定义规则在后台展示

使用Django-xadmin的ModelAdmin来对规则进行控制和管理,所有的规则可以在一个表中展示:

import xadmin
from xadmin import views
from .models import RuleGroup, Rule

class RuleAdmin(object):
    list_display = ('name', 'group', 'codename', 'url', 'icon', 'is_active')
    list_filter = ('group', 'is_active')

class PermissionAdmin(object):
    model_icon = 'fa fa-lock'
    menu_icon = 'fa fa-sitemap'
    sub_menus = RuleGroup.objects.all().values_list('id', 'name')
    sub_menu_filter_parameter_name = 'group'

xadmin.site.register(Rule, RuleAdmin)
xadmin.site.register(RuleGroup, PermissionAdmin)

4. 示例说明

4.1 示例一

举一个日常生活中的例子,比如我们在公司中可能会把职员分成不同的部门,比如技术部门、市场部门和人事部门,每个部门里面的职位不同,需要对应的不同的权限。这里我们可以使用Django-xadmin+rule对象级权限来实现。首先我们在model中定义规则,然后在后台展示,并将规则与职员和部门绑定。

class User(models.Model):
    name = models.CharField(max_length=50, verbose_name='姓名')

class Department(models.Model):
    name = models.CharField(max_length=50, verbose_name='部门名称')
    leader = models.ForeignKey(User, verbose_name='负责人')
    members = models.ManyToManyField(User, verbose_name='职员')

class Position(models.Model):
    name = models.CharField(max_length=50, verbose_name='职位名称')
    department = models.ForeignKey(Department, verbose_name='所属部门')
    rules = models.ManyToManyField(Rule, verbose_name='权限列表')

class RuleGroup(models.Model):
    name = models.CharField(max_length=50, verbose_name='权限组名称')

class Rule(models.Model):
    group = models.ForeignKey(RuleGroup, verbose_name='权限组', on_delete=models.CASCADE)
    name = models.CharField(max_length=50, verbose_name='权限名称')
    codename = models.CharField(max_length=255, verbose_name='权限编码_permission')
    url = models.CharField(max_length=255, verbose_name='URL')
    icon = models.CharField(max_length=50, verbose_name='图标', blank=True, null=True)
    is_active = models.BooleanField(default=False, verbose_name='是否可用')

xadmin.site.register(User, UserAdmin)
xadmin.site.register(Department, DepartmentAdmin)
xadmin.site.register(Position, PositionAdmin)
xadmin.site.register(Rule, RuleAdmin)
xadmin.site.register(RuleGroup, PermissionAdmin)

这样每一个职员都可以在后台管理系统中分配不同的权限,完成了对象级权限的控制。

4.2 示例二

再举一个更具体的例子,比如我们要开发一个学校的考试系统,系统管理员、学校教务处、教师和学生角色的权限不同:

class SchoolAdmin(models.Model):
    user = models.ForeignKey(User, verbose_name='用户')
    authorities = models.ManyToManyField(Rule, verbose_name='所有规则', blank=True)

class Teacher(models.Model):
    name = models.CharField(max_length=50, verbose_name='姓名')
    position = models.CharField(max_length=50, verbose_name='职称')
    admin = models.ForeignKey(SchoolAdmin, verbose_name='所属学校管理员')

    def save(self, *args, **kwargs):
        if not self.pk:
            admin = self.admin
            rules = admin.authorities.filter(is_active=True, group__name='教师权限')
            self.rules.add(*rules)
        super(Teacher, self).save(*args, **kwargs)

class Student(models.Model):
    name = models.CharField(max_length=50, verbose_name='姓名')
    exam_result = models.CharField(max_length=50, verbose_name='成绩')

class Course(models.Model):
    name = models.CharField(max_length=50, verbose_name='课程名称')
    teacher = models.ForeignKey(Teacher, verbose_name='任课教师', null=True, blank=True)

class RuleGroup(models.Model):
    name = models.CharField(max_length=50, verbose_name='权限组名称')

class Rule(models.Model):
    group = models.ForeignKey(RuleGroup, verbose_name='权限组', on_delete=models.CASCADE)
    name = models.CharField(max_length=50, verbose_name='权限名称')
    codename = models.CharField(max_length=255, verbose_name='权限编码_permission')
    url = models.CharField(max_length=255, verbose_name='URL')
    icon = models.CharField(max_length=50, verbose_name='图标', blank=True, null=True)
    is_active = models.BooleanField(default=False, verbose_name='是否可用')

xadmin.site.register(SchoolAdmin, SchoolAdminAdmin)
xadmin.site.register(Teacher, TeacherAdmin)
xadmin.site.register(Student, StudentAdmin)
xadmin.site.register(Course, CourseAdmin)
xadmin.site.register(Rule, RuleAdmin)
xadmin.site.register(RuleGroup, PermissionAdmin)

在这个例子中,我们以教师为例,先在SchoolAdmin的实例中存储了教师的所有规则,然后找到对应权限组中的所有规则,将它们添加到教师实例对象的rules字段中,最后再进行存储。这样就完成了教师权限的控制。

以上就是关于“Django-xadmin+rule对象级权限的实现方式”的完整攻略,希望能对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django-xadmin+rule对象级权限的实现方式 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • victoriaMetrics库布隆过滤器初始化及使用详解

    VictoriaMetrics库布隆过滤器初始化及使用详解 介绍 VictoriaMetrics是一个高效、可扩展、可靠的开源时序数据库和监控系统。该系统利用布隆过滤器(Bloom Filter)来高效地过滤出可能进行hash索引的值,从而提高检索效率。 本文将详细介绍如何在VictoriaMetrics库中进行布隆过滤器的初始化和使用,以及如何通过两个示例…

    人工智能概论 2023年5月25日
    00
  • Python执行Linux系统命令的4种方法

    Python执行Linux系统命令的4种方法 在Python中,我们可以使用多种方式执行Linux系统命令,以下是具体的4种方法: 方法1:os.system() os.system() 方法可以在Python程序中执行Linux系统命令。 import os os.system(‘ls -l’) 以上代码会在控制台输出ls -l命令的结果。 方法2:sub…

    人工智能概览 2023年5月25日
    00
  • 基于Django OneToOneField和ForeignKey的区别详解

    让我们一步步来详细讲解“基于Django OneToOneField和ForeignKey的区别详解”。 什么是OneToOneField和ForeignKey? 在Django中,我们经常需要在模型之间建立关系,以实现数据库数据的联接。在这样的时候,我们通常会使用内置的OneToOneField和ForeignKey两种关系类型。在理解它们的区别之前,我们…

    人工智能概览 2023年5月25日
    00
  • 使用Node.js搭建Web服务器

    使用Node.js搭建Web服务器是一项非常常见的操作,以下是基本步骤及示例说明: 步骤一:安装Node.js 首先,需要在自己的电脑上安装Node.js,可以前往官网下载并安装最新版本的Node.js。 步骤二:创建Node.js项目 在命令行中进入项目所处目录,运行以下命令: npm init 根据提示填写项目信息,会自动生成一个package.json…

    人工智能概览 2023年5月25日
    00
  • php7安装mongoDB扩展的方法分析

    安装MongoDB扩展是PHP开发中常见的需求之一,本篇攻略将详细介绍在PHP7上安装MongoDB扩展的方法以及相关的配置和使用细节。 前置条件 在开始之前,需要确保以下条件已具备: 已安装PHP7及MongoDB服务端 已安装PECL扩展管理工具(可通过命令pecl version检测是否已安装) 安装MongoDB PHP扩展 打开命令行工具(终端或C…

    人工智能概论 2023年5月25日
    00
  • ASP.NET(C#)读取Excel的文件内容

    下面我将为你详细讲解“ASP.NET(C#)读取Excel的文件内容”的完整攻略。 一、准备工作 在读取Excel文件之前,我们需要进行一些准备工作。 引入命名空间 在使用C#读取Excel文件之前,需要引入System.Data.OleDb命名空间,该命名空间包含了访问Excel文件的相关类。 csharpusing System.Data.OleDb; …

    人工智能概览 2023年5月25日
    00
  • Python 利用OpenCV给照片换底色的示例代码

    首先,为了实现给照片换底色,我们需要使用到 Python 图像处理库——OpenCV。接下来,让我们分步骤讲解实现过程: 步骤一:安装OpenCV 在命令行中输入以下命令: pip install opencv-python 步骤二:导入库并读取图片 import cv2 # 读取原图 img = cv2.imread(‘your_image.jpg’) 步…

    人工智能概览 2023年5月25日
    00
  • django模型类中,null=True,blank=True用法说明

    下面我将详细讲解“django模型类中,null=True,blank=True用法说明”的完整攻略。 前置知识 在进行本文的学习之前,你需要了解以下一些相关的术语和概念: Django:Django 是一个用 Python 编写的高级 Web 框架,它可以快速构建出丰富、动态的网站。 模型类(Model Class):模型类是 Django 中用于描述数据…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部