Django 的嵌套 render_to_response 总是显示内容类型
目前我正在尝试为一个请求创建多个视图。对于一个视图,我是这样做的:
return render_to_response(
"/index/index.html",
{}
)
现在,当我想在index.html中添加一个“左侧”列时,我需要把它放在不同的视图中(因为我还需要在其他地方使用相同的技术),这是我的做法:
leftCol = direct_to_template(request,settings.viewPath + "/columns/left.html",{})
return render_to_response(
"/index/index.html",
{
'leftColumn': leftCol,
}
这段代码运行得很好,但输出的结果并不是我预期的。左侧列的开头显示了响应头:
“Content-Type: text/html; charset=utf-8”
我该如何去掉这个头信息?我尝试修改参数中的content_type和mimetype,但没有成功。
3 个回答
‘render_to_response’这个函数会返回一个HttpResponse对象。你可以选择不直接返回这个对象,而是返回它的内容属性,这样就能只获取你想要显示的输出。
也就是说:
response = render_to_response(
"/index/index.html",
{
'leftColumn': leftCol,
}
return response.content
使用 render_to_string
(可以查看这个链接了解更多:http://docs.djangoproject.com/en/dev/ref/templates/api/#the-render-to-string-shortcut)可以在渲染一个模板后得到一个字符串。另一种方法是使用 {% include %}
来在当前模板的上下文中包含另一个模板(不过这还是需要手动操作)。更好的做法是创建一个基础模板,然后用 {% extends 'base.html' %}
来继承它,这样可以包含一些常用的模板功能,你可以通过 {% block %}
来覆盖这些功能,这样就能省去重复的模板内容,比如左侧的栏目。
这是因为 direct_to_template()
返回的是一个 HttpResponse
对象,而不是一个字符串。你有没有考虑过使用模板功能,比如 {% include %}
这个模板标签,或者自己写一个模板标签呢?
如果你坚持要在视图中预先渲染模板,然后再把它们组合到你的模板里,建议你自己渲染模板,而不是使用 direct_to_template()
。比如:
from django.template.loader import get_template
from django.template import RequestContext
def someview(request):
leftCol = get_template(settings.viewPath + "/columns/left.html").render(RequestContext(request)
render_to_response("/index/index.html", {'leftColumn': leftCol})