我可以通过Django视图在Decorator中访问上下文对象吗

时间:2020-09-17 14:54:11

标签: python django python-2.7 django-views python-decorators

我有多个django视图,我想根据它们的响应和状态代码向其中添加一些上下文。现在,我有一个看起来像这样的代码:

def my_decor(func):
    def wrapper(*args, **kwargs):
        response = func(*args, **kwargs)
        if response.status_code == 200:  # It will be changed to manipulate 2XX reponses only
            new_data = foo()
            response.context['some_new_data'] = new_data
        return response
    return wrapper


@my_decor
def view1(request):
    # some logic
    context = {'some_data': 'some_value'}
    return render(request, 'some_template.html', context)


@my_decor
def view2(request):
    # more logic
    return render(request, 'another_template.html')

因此,我想大胆地创建一个装饰器,该装饰器可用于在返回时附加上下文的视图和未在返回时附加上下文的视图。 现在我得到AttributeError: 'HttpResponse' object has no attribute 'context'。 我在做什么错了?

Python 2.7.13和Django 1.7.11

1 个答案:

答案 0 :(得分:1)

在装饰器中调用value之后,您已经渲染了模板,现在更改模板已为时已晚。

您可以切换到TemplateResponse,这允许您在呈现模板之前修改上下文。使用响应的func(*args, **kwargs)属性访问上下文。

context_data

在装饰器中,将from django.template.response import TemplateResponse @my_decor def view1(request): # some logic context = {'some_data': 'some_value'} return TemplateResponse(request, 'some_template.html', context) 更改为response.context

response.context_data