我试图在Django中为基于类的视图编写自定义装饰器。我想检查一个特定条件,即User被列为Scene对象的所有者。我编写了装饰器,如果用户是所有者,它可以正常工作 - 它允许用户正确地继续页面。但是,如果用户不是所有者,我会得到一个"此页面未正确重定向"错误。
这是我的装饰者:
def scene_is_yours(function):
def wrap(request, *args, **kwargs):
pk = kwargs.get('pk')
scene = Scene.objects.get(id=pk)
if not (scene.user.id == request.user.id):
return HttpResponseRedirect('project-mine')
return function(request, *args, **kwargs)
return wrap
以下是我的观点:
class SceneUpdateView(TemplateView):
model = Scene
fields = ['name', 'short_name', 'description']
template_name = 'scene/edit.html'
@method_decorator(login_required)
@method_decorator(scene_is_yours)
def dispatch(self, *args, **kwargs):
return super(SceneUpdateView, self).dispatch(*args, **kwargs)
我的追溯只是反复这两行:
[07/Jul/2015 22:10:35]"GET /accounts/login/?next=/scenes/1/edit/ HTTP/1.1" 302 0
[07/Jul/2015 22:10:35]"GET /scenes/1/edit/ HTTP/1.1" 302 0
我已经尝试删除login_required装饰器,但没有效果。我正在测试的用户帐户已登录,因此我无法弄清楚为什么它会尝试将我发送到登录状态然后再返回到装饰视图。发生了什么事?
答案 0 :(得分:0)
尝试从functools包装装饰器,也许你要重命名函数变量, 也许你应该使用django urlresolvers:
from functools import wraps
from django.core.urlresolvers import reverse
...
def scene_is_yours(view_function):
@wraps(view_function)
def wrap(request, *args, **kwargs):
pk = kwargs.get('pk')
scene = Scene.objects.get(id=pk)
if not (scene.user.id == request.user.id):
return HttpResponseRedirect(reverse('project-mine'))
return view_function(request, *args, **kwargs)
return wrap