我想创建一个装饰器,如果GET参数“raw”等于“1”,它将允许我返回视图的原始或“字符串”表示。这个概念有效,但我仍然坚持如何将上下文传递给我的渲染器。这是我到目前为止所做的:
from django.shortcuts import render_to_response
from django.http import HttpResponse
from django.template.loader import render_to_string
def raw_response(template):
def wrap(view):
def response(request,*args,**kwargs):
if request.method == "GET":
try:
if request.GET['raw'] == "1":
render = HttpResponse(render_to_string(template,{}),content_type="text/plain")
return render
except Exception:
render = render_to_response(template,{})
return render
return response
return wrap
目前,{}就像占位符一样。最终,我希望能够通过这样的字典:
@raw_response('my_template_name.html')
def view_name(request):
render({"x":42})
感谢任何帮助。
答案 0 :(得分:0)
您只需要在装饰器中调用view
并使用从中返回的上下文。
if request.method == "GET":
context = view(*args, **kwargs)
try:
if request.GET['raw'] == "1":
render = HttpResponse(
render_to_string(template, context),
content_type="text/plain"
)
return render
等等。虽然如果raw
不是1,我不确定会发生什么。
答案 1 :(得分:0)
让您的真实视图方法返回合理的内容(在这种情况下为上下文dict
)并调用它。
def raw_response(template):
def wrap(view):
def response(request, *args, **kwargs):
context = view(request, *args, **kwargs)
if request.method == 'GET' and request.GET.get('raw', '0') == '1':
return HttpResponse(render_to_string(template, context),
content_type='text/plain')
# POST or not raw
return render_to_response(template, context)
return response
return wrap
@raw_response('my_template_name.html')
def view_name(request):
return {'x': 42}