【问题标题】:Django's nested render_to_response always show content-typeDjango 的嵌套 render_to_response 总是显示内容类型
【发布时间】:2011-07-28 05:50:54
【问题描述】:

目前我正在尝试为一个请求创建多个视图。对于 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 但没有成功。

【问题讨论】:

  • leftCol 使用的是 direct_to_template,在它也是 render_to_response 之前。但结果是一样的。
  • 阅读有关渲染内容的文档:docs.djangoproject.com/en/dev/ref/templates/api/… 另一种方法可能是使用模板标签或包含(直接在模板级别)

标签: python django templates view render


【解决方案1】:

“render_to_response”函数返回一个 HttpResponse 对象。除了返回对象本身,您还可以返回其内容属性以仅访问要呈现的输出。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 赞成。这正是我需要将模板标签呈现到我的默认处理的 404 页面。太棒了。
    【解决方案3】:

    这是因为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})
    

    【讨论】:

    • 是的,模板标签——特别是包含标签——是更好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多