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日

相关文章

  • Python中的pass语句使用方法讲解

    下面我将为您详细讲解“Python中的pass语句使用方法讲解”。 什么是pass语句 在Python中,pass是一个占位符语句,用来表示一个什么也不做的语句块,它是与其他语句(如条件语句和循环语句等)一起使用的,用来表示程序中缺失的代码段,将来可以在这些位置添加代码。 pass语句的语法 pass语句的语法非常的简单,只包含一个pass关键字,如下所示:…

    人工智能概论 2023年5月25日
    00
  • Django代码性能优化与Pycharm Profile使用详解

    下面是我对“Django代码性能优化与Pycharm Profiler使用详解”的攻略。 1. 什么是Django? Django是一个优秀的Python web框架。它的设计目标是开发快速而且易维护的web应用程序,其具有以下特点: 开发速度快 不需要前置的任何库 自带ORM(Object-relational mapping,即对象关系映射) 可扩展性强…

    人工智能概论 2023年5月25日
    00
  • 联想小新熊猫打印机怎么样?联想小新熊猫打印机使用评测

    联想小新熊猫打印机怎么样?联想小新熊猫打印机使用评测 联想小新熊猫打印机是一款轻巧便携的热敏无墨打印机,外观可爱,同时也兼备一定的性能和功能,是一款比较适合学生或者办公室小伙伴使用的打印机。 外观设计 联想小新熊猫打印机采用白色背景色,黑色和灰色为主色调,机身尺寸为2066670mm,体积非常轻盈,重量仅为434g,非常便携。在外观设计上,小新熊猫打印机上还…

    人工智能概览 2023年5月25日
    00
  • Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境

    下面我将为大家详细讲解一下“Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境”的攻略: 准备工作 在开始搭建之前,我们需要确保准备好以下工作: 安装了 Homebrew,可以使用命令 brew –version 检查是否已安装。 确定自己需要的 PHP 版本,并记录下来。 选择自己需要的数据库,并确保安装了相应的数据库服务和客户端。 安装 …

    人工智能概论 2023年5月25日
    00
  • Python关于print的操作(倒计时、转圈显示、进度条)

    Python中关于print的操作可以实现各种有趣的效果,本攻略将会详细讲解三种print的操作,分别为倒计时、转圈显示和进度条。 倒计时 倒计时是一种非常有用的效果,可以在很多场合使用,比如计时器、倒计时动画等。下面提供一段Python代码实现倒计时: import time def countdown(t): while t > 0: m, s =…

    人工智能概论 2023年5月25日
    00
  • 基于Python实现捕获,播放和保存摄像头视频

    基于Python实现捕获,播放和保存摄像头视频的完整攻略 1. 硬件准备和安装必要的软件包 在开始前,需要准备好计算机摄像头和安装好Python以及常用的Python图像处理包如cv2、numpy等。 2. 使用cv2捕获摄像头视频 首先我们需要使用Python中的cv2库(opencv-python)进行摄像头视频捕获。以下是一段示例代码: import …

    人工智能概论 2023年5月25日
    00
  • 流行的软件测试工具介绍

    流行的软件测试工具介绍 在软件开发和测试过程中,使用合适的测试工具可以提高测试效率和测试质量。以下是一些流行的软件测试工具的介绍及其使用场景和示例。 功能测试工具 1. Selenium Selenium 是一款功能测试工具,可以模拟用户在多种不同浏览器上操作网页,支持多种开发语言。例如,可以使用 Selenium 对网站进行自动化测试,验证网站是否符合用户…

    人工智能概论 2023年5月25日
    00
  • Google和Facebook不使用Docker的原理解析

    下面是关于“Google和Facebook不使用Docker的原理解析”的完整攻略,内容如下: 什么是Docker Docker是一种轻量级的虚拟化容器技术,它可以快速打包、交付和运行软件应用程序。使用Docker的主要优点是: 方便打包和部署应用程序 快速启动和关闭容器 可以隔离应用程序和依赖项 Google和Facebook为什么不使用Docker 尽管…

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