gpt4 book ai didi

django - 如何使用 Django 装饰器测试用户对对象的所有权

转载 作者:行者123 更新时间:2023-12-04 12:52:08 25 4
gpt4 key购买 nike

我正在处理一个 Django 项目,并试图弄清楚如何测试用户所有权并允许根据结果进行编辑或重定向。

我有一个模型 Scene . Scene链接到 User跟踪哪个用户创建了特定 Scene :

class Scene(models.Model):
user = models.ForeignKey(User)
[rest of Scene model]

我有一个 URL 模式来编辑特定的 Scene像这样的对象:
url(r'^scenes/(?P<pk>[0-9]+)/edit/', SceneUpdateView.as_view(), name='scene-edit'),

我有一个通过 django-allauth 登录的用户。我只想要 Scene业主可以编辑 Scenes .

我想弄清楚如何使用装饰器来测试 scene.user.id == self.request.user.id对于 URL 调用的特定场景。

我是否需要将 URL 信息发送到 permission_requireduser_passes_test装饰器(这可能)?

我怎样才能做到这一点?

最佳答案

您可以使用自定义装饰器来满足您的特定需求。
注意:我正在使用基于函数的 View ,如果需要,您必须将代码修改为基于类的 View :

import json

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_protect
from django.contrib.auth.models import User
from yourmodels.models import Scene

#Custom decorator
def must_be_yours(func):
def check_and_call(request, *args, **kwargs):
#user = request.user
#print user.id
pk = kwargs["pk"]
scene = Scene.objects.get(pk=pk)
if not (scene.user.id == request.user.id):
return HttpResponse("It is not yours ! You are not permitted !",
content_type="application/json", status=403)
return func(request, *args, **kwargs)
return check_and_call

#View Function
@must_be_yours
@csrf_protect
def update_scene(request, pk=None):
print pk
if request.method == 'PUT':
#modify merely
pass
网址:
url(r'^scenes/(?P<pk>[0-9]+)/edit/', 'update_scene'),

关于django - 如何使用 Django 装饰器测试用户对对象的所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31197517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com