下面我将为您讲解“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技术站