【问题标题】:Render to template and get a response渲染到模板并获得响应
【发布时间】:2013-06-26 01:14:57
【问题描述】:

我有这样的情况,我正在从 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 被它的值替换,但是在 html 中定义的变量,如 HEADER , FOOTER 不会被它的内容替换。

我知道这很复杂,可能不可能。

但是谁能给我一些建议,以便我可以更改模板中的变量

【问题讨论】:

  • 你尝试mark_safe html 变量了吗?
  • 你的 html 变量包含这个值? {{HEADER}} 你好 {{NAME}}, {{FOOTER}}
  • @matino 没有,我没试过这个
  • @Sudipta,是的。当我渲染到 abc.html 时, {{html}} 替换为那里的值,但页眉页脚没有

标签: python django django-templates rendering


【解决方案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.

【讨论】:

  • 感谢您的回复,您建议的方式对我不起作用,因为在 Html 中我可以定义更多变量,而不仅仅是页眉和页脚。
  • 好的。然后在发送 'html' 变量进行渲染之前使用 replace() 函数。 finalhtml = html.replace('{{HEADER}}',html_header).replace('{{FOOTER}}',html_footer)
  • 我也在考虑用同样的东西
  • @Inforian 您可以直接从字符串加载模板,而不是从 html 文件加载。我已在编辑中添加了解决方案。
猜你喜欢
  • 2021-06-28
  • 2017-10-12
  • 2017-08-29
  • 2015-06-23
  • 1970-01-01
  • 2018-08-19
  • 2016-01-08
  • 1970-01-01
  • 2010-11-30
相关资源
最近更新 更多