渲染到模板并获得响应

时间:2013-06-28 09:43:04

标签: python django django-templates rendering

我有这样的情况,我从db获取一些html,就像这样存储在变量 html 中,

{{HEADER}} </br>
Hello {{NAME}}, </br>
{{FOOTER}}

如您所见,我已经以这种方式定义数据,这样当我将其渲染到任何模板时,变量(HEADER,FOOTER等)可以被实际值替换。 但这不会发生。  我创建了一个模板abc.html,我在其中进行渲染,此模板的内容为 {{html}} ,当我渲染到此模板时,它将被上面的代码替换。

我试过这个 -

html_content =TemplateResponse(request,"abc.html",{'html':html,'HEADER':html_header,'FOOTER':html_footer})
html_content.render()

现在的问题是,在abc.html中只有html被其值替换,但是像HEADER,FOOTER这样的html中定义的变量不会被其内容替换。

我知道这很复杂,可能无法实现。

但任何人都可以通过某种方式向我提出建议,以便我可以更改模板中的变量

1 个答案:

答案 0 :(得分:1)

是的,这是因为最终的html模板只渲染一次。在渲染abc.html时,它会查找所有模板变量并替换它们。在这种情况下,只有'html'被其值替换。然后html被渲染,因为它没有找到任何其他变量或包含html。

如果要在另一个模板变量中传递模板变量,那么它将不会被渲染。

您可以这样做:

#abc.html
{{HEADER}}
{{ CONTENT }}
{{FOOTER}}

#in view
html_content =TemplateResponse(request,"abc.html {'CONTENT':html_content,'HEADER':html_header,'FOOTER':html_footer})

为此,您需要在数据库中以html的格式进行更改。

但正如你所说,在你的情况下,除了页眉和页脚之外还有许多模板变量,那么你可以在发送它之前更新'html'变量进行渲染。

finalhtml = html.replace('{{HEADER}}',html_header).replace('{{FOOTER}}',html_footer)
html_content =TemplateResponse(request,"abc.html {'html':finalhtml})

或者您可以使用:

from django.template import Context, Template
t = Template(html)
c = Context({'HEADER':html_header,'FOOTER':html_footer})
return HttpResponse(t.render(c))

我猜这个是最干净的方法;即从字符串而不是文件加载模板。 See documentation here