在 Django CBV 中调用 DetailView 时,是不是仍然可以在 has_permission 方法中获取当前对象

Posted

技术标签:

【中文标题】在 Django CBV 中调用 DetailView 时,是不是仍然可以在 has_permission 方法中获取当前对象【英文标题】:Is there anyway to get the current object in has_permission method while calling DetailView in Django CBV在 Django CBV 中调用 DetailView 时,是否仍然可以在 has_permission 方法中获取当前对象 【发布时间】:2020-10-12 02:20:07 【问题描述】:

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

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

谢谢

【问题讨论】:

【参考方案1】:

按照有关如何创建自定义权限的文档进行操作。

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

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)

这将返回您在 url 中传递的id,然后您可以获取该对象

【讨论】:

以上是关于在 Django CBV 中调用 DetailView 时,是不是仍然可以在 has_permission 方法中获取当前对象的主要内容,如果未能解决你的问题,请参考以下文章

Django的CBV方式讲解

Django:两个模型中的一个 url 搜索(cbv)

在 Django CBV 中调用 DetailView 时,是不是仍然可以在 has_permission 方法中获取当前对象

7)django-实例(cbv)

django补充CBV和FBV模式

django的FBV和CBV