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

Django UpdateView如何允许记录创建者及被分配用户编辑记录

问题解答

你当前使用的是UserPassesTestMixin提供的test_func()做权限校验,该方法只要返回True就会放行请求,你只需要把「创建者匹配」「被分配用户匹配」两个条件做或逻辑判断即可,具体修改如下:

正确实现代码

首先确保类视图的继承顺序正确,LoginRequiredMixin要放在最前面,避免匿名用户访问时报错:

from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.views.generic import UpdateView
from .models import Record

class RecordEditView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Record
    # 你原有的fields、模板路径、跳转地址等配置保持不变即可

    def test_func(self):
        # 手动获取当前要编辑的记录实例,兼容所有Django版本的执行时序
        target_record = self.get_object()
        # 两个权限条件满足任意一个即允许访问
        return (
            self.request.user == target_record.created
            or self.request.user == target_record.assigned
        )

注意事项

  • 不建议直接用self.object获取记录:部分Django版本中test_func执行时self.object还未完成赋值,手动调用get_object()可以稳定拿到当前操作的记录实例,避免属性不存在的报错。
  • 继承顺序不要乱:LoginRequiredMixin必须放在所有mixin和视图类的最前面,保证未登录用户会被直接拦截跳转到登录页,不会走到用户比对逻辑抛出异常。
  • 如果你的created/assigned字段存的是用户ID而非用户外键(不推荐该设计),比对时需要取用户ID做判断:return self.request.user.id == target_record.created or self.request.user.id == target_record.assigned,常规设计下两个字段都应该是关联用户模型的外键,直接比对用户对象即可。

这个实现完全作用于前端业务侧的类视图,不会影响Django Admin后台的原有权限逻辑。


内容的提问来源于stack exchange,提问作者dainys

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 02:09:39