我可以在decorator over django视图中访问上下文对象吗

2022-12-05 01:58:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有多个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')

所以,基本上,我想创建decorator,它可以用于在返回时附加上下文的视图,也可以用于不附加上下文的视图。 现在我得到了AttributeError: 'HttpResponse' object has no attribute 'context'。 我做错了什么

Python 2.7.13和Django 1.7.11


Tags: 代码视图newdatareturnresponserequestmydefcontextargssomewrapperfuncdecor
1条回答
网友
1楼 · 发布于 2022-12-05 01:58:43

在decorator中调用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

    if response.status_code == 200:  # n.b. this is only for 200 responses, not 2XX as you say in your comment
        new_data = foo()
        response.context_data['some_new_data'] = new_data