Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从装饰器向基于Django类的视图添加/修改属性?_Python_Django_Django Class Based Views_Python Decorators - Fatal编程技术网

Python 如何从装饰器向基于Django类的视图添加/修改属性?

Python 如何从装饰器向基于Django类的视图添加/修改属性?,python,django,django-class-based-views,python-decorators,Python,Django,Django Class Based Views,Python Decorators,我有一个基于类的Django视图,如下所示: class myView(TemplateView): template_name = 'templateFile.html' request = None @method_decorator(request_management) def dispatch(self, request, *args, **kwargs): ... return super(myView, self).

我有一个基于类的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_管理decorator中,我想将myView.request的值设置为传递到dispatch函数中的参数。所以我做了这样的事情:

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
但是在decorator中,我无法访问decorated方法的“self”实例。
如何获取该实例并向其附加名为request的属性,以便在该实例的其他方法中使用该属性?

方法装饰器的目的是。但是,既然您正在编写自己的decorator,那么您可以继续编写它作为实际的方法decorator:

class myView(TemplateView):

    @request_management
    def dispatch(self, request, *args, **kwargs):
        ... 
        return super(myView, self).dispatch(request, *args, **kwargs)

    def request_management(method): 
        @wraps(method)
        def decorator(self, request, *args, **kwargs):
            logger.debug("request = %s" % str(request))
            self.request = request

            return method(self, request, *args, **kwargs)

        return decorator

我在下面回答,但您是否知道已在基于类的视图中为您创建了
self.request
?看,不。我不知道。非常感谢。但我还需要将其他参数作为属性添加到self中。我敢肯定你做得不对。根据我的经验,覆盖
dispatch
几乎从来都不是正确的策略。此外,在处理基于类的视图时,考虑使用MIXIN通常是一个好主意。你到底想达到什么目的?