我正在使用DetailView来查看Project对象,我希望能够访问正在查看的Project对象,以便将其传递给装饰器,如下所示:
class ProjectDetailView(DetailView):
context_object_name = "project"
model = Project
@method_decorator(membership_required(project))
def dispatch(self, *args, **kwargs):
return super(ProjectDetailView, self).dispatch(*args, **kwargs)
但是,将“project”或“object”传递给装饰器会给我一个“对象”,而不是Project实例。如何获取Project实例,以便我的装饰器功能可以使用它?
答案 0 :(得分:8)
在dispatch()方法中检索对象,因此装饰器无法使用它。 您可以检查覆盖的get()方法内的成员资格:
class ProjectDetailView(DetailView):
context_object_name = "project"
model = Project
def get(self, request, **kwargs):
self.object = self.get_object()
if not self.object.is_member(self.request.user):
return HttpResponseRedirect('/') # or something else
context = self.get_context_data(object=self.object)
return self.render_to_response(context)
如果你想坚持使用装饰器,你必须根据要查看的args(id或slug)从装饰器中的数据库中检索对象。但是,您将从数据库中检索对象两次,首先在装饰器中,然后在视图中。