Django的嵌套render_to_response总是显示内容类型

时间:2011-04-02 12:24:00

标签: python django templates view render

目前我正在尝试为一个请求创建多个视图。对于1个观点,我这样做:

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,
    }

代码运行良好,但输出不是我的预期。 leftCol在输出的开头显示响应头:

“Content-Type:text / html; charset = utf-8”

如何删除此标头?我一直在尝试修改参数中的content_type和mimetype,但它不起作用。

3 个答案:

答案 0 :(得分:4)

那是因为direct_to_template()返回HttpResponse,而不是字符串。您是否考虑过使用模板功能,例如: {% include %}模板标记,或者编写自己的模板标记?

如果您坚持在视图中预渲染模板,然后将它们合并到模板中,请自行渲染模板,而不是使用direct_to_template()。 e.g。

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})

答案 1 :(得分:4)

使用render_to_stringhttp://docs.djangoproject.com/en/dev/ref/templates/api/#the-render-to-string-shortcut)在渲染模板后获取字符串。或者,您可以使用{% include %}在与当前模板相同的上下文中包含模板(但这仍然是手动的)。更好的方法是使用{% extends 'base.html' %}继承的基本模板,它只包含您可以使用{% block %}随意覆盖的常用模板功能,并允许您省略重复的模板内容,如左列。

答案 2 :(得分:0)

' render_to_response' function返回一个HttpResponse对象。您可以返回其content属性以仅访问要呈现的输出,而不是返回对象本身。

response = render_to_response(
    "/index/index.html",
    {
    'leftColumn': leftCol,
    }
return response.content