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
相关产品推荐
相关产品推荐

