2017-02-09 100 views
0

我想在我的装饰器中调用self,但我得到错误。一些背景第一:Django视图装饰器访问'自我'

我有以下型号:

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

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

我想有网址,编辑城市/颜色,如: /edit/<model-name>/<model-id>,但我要确保这是唯一可如果request.user是与model_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。我如何使这个装饰工作?谢谢!

回答

0

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

您可能想了解Here

+0

是啊,我用'name ='dispatch'',遗憾的错误。但我仍然得到同样的错误。 – irene

+0

我也编辑了代码。似乎Django要求'_testview'具有'request'作为“必需的位置参数”。但是如果我把'self'放在那里,它就找不到'request' ... – irene

相关问题