django - 在 Django CBV 中调用 DetailView 时,是否仍然可以在 has_permission 方法中获取当前对象
问题描述
我有一个 DetailView,我想根据与此付款相关的用户项目分配来限制对付款的访问。我有以下代码工作得很好。只是想知道是否有一种更简洁的方法可以在 has_permission 中检索 self.object 而不是直接使用 PK 获取对象。
class PaymentDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView):
model = Payment
template_name = "finance/payments/details.html"
context_object_name = "payment"
def has_permission(self):
payment = Payment.objects.get(pk=self.kwargs.get("pk"))
# Check permission here based on the current user project assignment
if condition:
return True
return False
我知道 has_permission 是 PermissionRequiredMixin 而不是 DetailView 的一部分,这可能是不可能的,但我想知道是否有更好的方法来测试这个基于对象的权限。
注意:逻辑有点复杂,可能没有简单的查询那么简单(实际上是根据用户角色、项目分配、分配时间对比支付日期、支付类型...... )
谢谢
解决方案
遵循有关如何创建自定义权限的文档。
您的自定义权限应如下所示:
from rest_framework.permissions import BasePermission, SAFE_METHODS
class CustomPermission(BasePermission):
def has_permission(self, request, view):
.......
在 has_permission 你可以这样做:
from rest_framework.permissions import BasePermission, SAFE_METHODS
class CustomPermission(BasePermission):
def has_permission(self, request, view):
id = view.kwargs.get('pk', None)
这将返回您id
在 url 中传递的内容,然后您可以获取该对象
推荐阅读
- android - android xml udacity 屏幕两侧之间的间隙
- java - 使用 servlet 和数据库限制登录尝试
- php - 当我输入错误密码时,此 PDO 登录表单也会记录我。如何解决?
- apache-spark - 将容量调度程序从默认更改为 ambari 上的 DominantResourceCalculator 后无法重新启动 spark2 thriftserver、spark-shell、sparksql
- mysql - SELECT 列表的表达式 #3 不在 GROUP BY 子句中,并且在尝试创建视图时包含非聚合列
- javascript - Paypal SDK 问题得到错误 [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
- python - 单个 FMU 的多核仿真
- java - Java DTO 和最终字段
- ffmpeg - 使用 FFMPEG 计算的 SSIM 值不是我所期望的
- requirejs - 如何使用 requireJS 加载车把