【发布时间】: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.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。我如何使这个装饰器工作?谢谢!
【问题讨论】:
-
您找到解决方案了吗?我有完全相同的问题,不知道如何继续。
-
好久不见,不好意思忘记了……
标签: python django decorator self