在 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 中调用 DetailView 时,是不是仍然可以在 has_permission 方法中获取当前对象