首页 > 解决方案 > 在 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 的一部分,这可能是不可能的,但我想知道是否有更好的方法来测试这个基于对象的权限。

注意:逻辑有点复杂,可能没有简单的查询那么简单(实际上是根据用户角色、项目分配、分配时间对比支付日期、支付类型...... )

谢谢

标签: djangopermissionsdjango-viewsdjango-permissions

解决方案


遵循有关如何创建自定义权限的文档。

您的自定义权限应如下所示:

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 中传递的内容,然后您可以获取该对象


推荐阅读