如何将 django 模板变量呈现为 html?
Posted
技术标签:
【中文标题】如何将 django 模板变量呈现为 html?【英文标题】:how to render django template variable as html? 【发布时间】:2012-12-11 08:15:36 【问题描述】:我想要的是堆栈溢出。用户可以 html 格式化他们的文本输入,并且页面应该以完全相同的方式呈现,
我使用wmd.js
来存储格式化的输入,假设我有一个上下文变量variable
和字符串值"<p>something</p>"
。当我渲染模板时,
variable outputs <p>something</p>
and variable|safe also output <p>something</p>
它将html标签显示为页面中的文本。如何在variable
中呈现 HTML 标记,但不将它们显示为纯文本。
模板
<div id='thread_answer_content' >
% for answer in question.answer_set.all %
answer.answerbody|safe
% endfor %
</div>
观点
def detail(request,question_id):
q = get_object_or_404(Question,pk=question_id)
return render_to_response('CODE/detail.html','question':q,
context_instance = RequestContext(request)
)
这里是问题的 django 管理页面,顺便说一下,我使用的是 sqlite3
【问题讨论】:
something
是什么?是上下文变量吗?
如果查看渲染页面的源码,看到&lt;p%gt;something&lt;/&gt;
还是<p>something</p>
?
源显示 something
answer.answerbody
究竟在数据库中包含什么?为了安全起见,它可能是双双引号或可以包含由wmd.js
添加的转义字符。这样,它可能会破坏safe
过滤器。
【参考方案1】:
您可能希望使用escape
来渲染它,而不是safe
。
variable|escape
【讨论】:
@rohan - 他实际上希望它被分段而不是转义。【参考方案2】:对于简单的 HTML 格式,请使用 <p>something</p>
。而javascript的方式是,
<script type="text/javascript">
var variable = "<p>something</p>";
document.write(variable);
</script>
如果 something
本身包含 HTML 标记,那么 something|safe
本身应该可以工作,除非您有 % autoescape on %
。更多过滤和格式化请参考Built-in template tags and filters。
【讨论】:
好的假设用户输入像这样“hello world
”,我实际上保存输入像“hello world
”,现在我想用输入渲染模板,所以我做了这个 variable = "hello world
",variable;现在输出将是hello world
,但我不希望标签像文本一样显示,我需要将其呈现为 html 标签,这意味着输出应该是“hello世界”在 html 段落标签中。
这样做的原因是因为这样用户可以格式化他们的输入,所以输出将完全相同,就像堆栈溢出一样,当你发布问题时,你格式化你的输入,并且将以相同的格式发布。 所以您想要客户端预览,对吗?那么你不应该在你的问题中混合
,它指的是从响应中提供的上下文变量。
不,我得到了预览,我使用了 wmd.js,但是在用户发布他们的问题后,如何以同样的方式呈现服务器响应???
那么variable|safe
应该可以工作。你最好发布你的确切代码。你设置% autoescape on %
了吗?【参考方案3】:
使用标签:http://docs.djangoproject.com/en/dev/ref/templates/builtins/#autoescape
% autoescape off % variable % endautoescape %
【讨论】:
【参考方案4】:我认为另一种方法是使用firstof
tag:
注意firstof标签中包含的变量不会被转义。这是因为模板标签不会转义它们的内容。打印变量中包含的任何 HTML 或 Javascript 代码都将按原样呈现,这可能会导致安全问题。如果需要对 firstof 标签中的变量进行转义,则必须明确地这样做
% firstof variable %
【讨论】:
以上是关于如何将 django 模板变量呈现为 html?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 js 或 html 的情况下摆脱 django 模板变量中的空间和 amp