【发布时间】:2014-05-19 04:14:20
【问题描述】:
我有一个基于类的 Django 视图,如下所示:
class myView(TemplateView):
template_name = 'templateFile.html'
request = None
@method_decorator(request_management)
def dispatch(self, request, *args, **kwargs):
...
return super(myView, self).dispatch(request, *args, **kwargs)
def get_context_data(self, *args, **kwargs):
ctx = super(newFeatures, self).get_context_data(**kwargs)
ctx['requester'] = self.requester
return ctx
在我的 request_management 装饰器中,我想将 myView.request 的值设置为传递给调度函数的参数。所以我做了这样的事情:
def request_management(function):
@wraps(function)
def decorator(*args, **kwargs):
logger.debug("request = %s" % str(args[0]))
# I want to say here something like:
# self.request = args[0]
# but of course, "self" is not defined in this context.
return function(*args, **kwargs)
return decorator
但在装饰器中,我无法访问被装饰方法的“self”实例。 如何获取该实例并将名为 request 的属性附加到它,以便我可以在该实例的其他方法中使用该属性?
【问题讨论】:
-
我在下面回答了,但您知道
self.request已经在基于类的视图中为您创建了吗?见here。 -
没有。我一点头绪都没有。谢谢!但是我需要将其他参数添加到 self 作为属性。
-
我很确定你做错了。以我的经验,覆盖
dispatch几乎从来都不是正确的策略。此外,在处理基于类的视图时,考虑使用 mixin 通常是个好主意。你到底想达到什么目的?
标签: python django django-class-based-views python-decorators