如何使用django-rules为courses表不同课程实例设置专属用户报名权限
django-rules 实现课程实例级报名权限方案
1. 基础配置
首先安装django-rules并完成项目基础配置,修改settings.py:
INSTALLED_APPS = [ # 原有其他应用 'rules', '你自己的应用名', ] AUTHENTICATION_BACKENDS = [ # 保留Django默认权限后端 'django.contrib.auth.backends.ModelBackend', # 新增django-rules对象权限后端 'rules.permissions.ObjectPermissionBackend', ]
2. 模型改造
在你的应用models.py中给Course表新增多对多关联字段,存储每个课程允许报名的用户:
from django.db import models from django.contrib.auth import get_user_model User = get_user_model() class Course(models.Model): # 保留原有课程字段,比如课程名、开课时间等 name = models.CharField(max_length=100) # 新增允许报名的用户关联字段 allowed_enroll_users = models.ManyToManyField(User, related_name="enrollable_courses", blank=True)
执行makemigrations和migrate同步数据库结构。
3. 定义权限规则
在你的应用下新建rules.py文件,编写实例级权限判断逻辑:
import rules from .models import Course @rules.predicate def can_enroll_course(user, course): # 未登录用户直接无权限 if not user.is_authenticated: return False # 可自定义扩展逻辑,比如管理员默认拥有所有课程报名权限 if user.is_superuser: return True # 判断用户是否在当前课程的允许报名列表中 return course.allowed_enroll_users.filter(id=user.id).exists() # 注册规则为权限,第一个参数格式为「应用名.权限名」 rules.add_perm("你的应用名.enroll_course", can_enroll_course)
4. 权限使用
视图中调用
函数视图用法
from django.shortcuts import get_object_or_404, HttpResponse from rules.contrib.views import permission_required from .models import Course @permission_required('你的应用名.enroll_course', fn=lambda request, course_id: get_object_or_404(Course, id=course_id)) def enroll_course(request, course_id): # 进入此函数则说明用户拥有报名权限,直接写报名逻辑即可 return HttpResponse("报名成功")
类视图用法
from django.views.generic import View from rules.contrib.views import PermissionRequiredMixin from django.shortcuts import get_object_or_404 from .models import Course class EnrollCourseView(PermissionRequiredMixin, View): permission_required = '你的应用名.enroll_course' # 返回要校验权限的课程实例 def get_object(self): return get_object_or_404(Course, id=self.kwargs['course_id']) def post(self, request, *args, **kwargs): # 报名逻辑 return HttpResponse("报名成功")
模板中调用
直接通过模板全局变量perms判断,course为当前课程实例变量:
{% if perms.你的应用名.enroll_course course %} <button>报名课程</button> {% else %} <span>你没有该课程的报名权限</span> {% endif %}
业务代码中手动判断
# course_instance为要校验的课程实例对象 if user.has_perm('你的应用名.enroll_course', course_instance): # 执行报名逻辑 pass
内容的提问来源于stack exchange,提问作者PG04
相关产品推荐
相关产品推荐

