我有多个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
调用func(*args, **kwargs)
装饰器后,您已经渲染了模板,现在更改模板已为时已晚。
您可以切换到TemplateResponse
,以允许您在呈现模板之前修改上下文。使用响应的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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句