【问题标题】:Django view decorator accessing 'self'Django视图装饰器访问'self'
【发布时间】:2017-02-09 05:01:24
【问题描述】:

我试图在我的装饰器中调用self,但出现错误。先介绍一下背景:

我有以下型号:

Car(models.Model):
   user = ForeignKey(User)
   color = models.CharField(max_length=25)

Location(models.Model):
   user = ForeignKey(User)
   city = models.CharField(max_length=25)

我希望有 URL 来编辑城市/颜色,例如: /edit/<model-name>/<model-id>,但我想确保只有在 request.usermodel_instance.user 相同时才能访问它。所以我有以下看法:

class EditView(View):
    ThisModel = Model

    def get(self, request, model_id):
        instance = self.ThisModel.objects.get(id=model_id)
        if instance.user != request.user:
            return HttpResponseForbidden("You can't do this!")
        else:
            # return form
            return render(request, 'my_template.html', context={'form':form})

    def post(request, model_id):
        instance = self.ThisModel.objects.get(id=model_id)
        if instance.user != request.user:
            return HttpResponseForbidden("You can't do this!")
        else:
            # save form
            return HttpResponse('Edit successful.')

class EditCarView(EditView):
    ThisModel = Car

class EditLocationView(EditView):
    ThisModel = Location

我不想重复getpost 方法共有的instance=... 行,而是想使用装饰器。我试过这个:

def current_user_only(func):
    def _check_curr_user(view_func):
        def _testview(self, request, model_id, *args, **kwargs):
            self.instance = self.ThisModel.objects.get(id=model_id)
            if self.instance.user != request.user:
                return HttpResponseForbidden("Forbidden.")
            else:
                return view_func(request, username, *args, **kwargs)

        _testview.__name__ = view_func.__name__
        _testview.__dict__ = view_func.__dict__
        _testview.__doc__ = view_func.__doc__

        return _testview

    return _check_curr_user(func)

并在我的观点中使用它:

@method_decorator(current_user_only, name='dispatch')
EditView(View):

但我得到一个错误,_testview 缺少一个位置参数request。我如何使这个装饰器工作?谢谢!

【问题讨论】:

  • 您找到解决方案了吗?我有完全相同的问题,不知道如何继续。
  • 好久不见,不好意思忘记了……

标签: python django decorator self


【解决方案1】:

在你的情况下,我认为你必须使用, @method_decorator(current_user_only, name='dispatch') EditView(View):

您可能喜欢阅读Here

【讨论】:

  • 啊,是的,我用了name='dispatch',抱歉弄错了。但我仍然得到同样的错误。
  • 我还编辑了代码。似乎 Django 要求 _testviewrequest 作为“必需的位置参数”。但是如果我把self放在那里,它就找不到request...
猜你喜欢
  • 2016-09-24
  • 1970-01-01
  • 2011-02-06
  • 2012-04-21
  • 2018-10-18
  • 2014-06-07
  • 2016-08-14
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多