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
而不是重复两者共同的get
和post
方法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
。我如何使这个装饰工作?谢谢!
是啊,我用'name ='dispatch'',遗憾的错误。但我仍然得到同样的错误。 – irene
我也编辑了代码。似乎Django要求'_testview'具有'request'作为“必需的位置参数”。但是如果我把'self'放在那里,它就找不到'request' ... – irene