You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:24:03