如何将 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 是什么?是上下文变量吗? 如果查看渲染页面的源码,看到&amp;lt;p%gt;something&amp;lt;/&amp;gt;还是&lt;p&gt;something&lt;/p&gt; 源显示

something

answer.answerbody 究竟在数据库中包含什么?为了安全起见,它可能是双双引号或可以包含由wmd.js 添加的转义字符。这样,它可能会破坏safe 过滤器。 【参考方案1】:

您可能希望使用escape 来渲染它,而不是safe

 variable|escape 

【讨论】:

@rohan - 他实际上希望它被分段而不是转义。【参考方案2】:

对于简单的 HTML 格式,请使用 &lt;p&gt;something&lt;/p&gt;。而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?的主要内容,如果未能解决你的问题,请参考以下文章

Django:避免在模板中呈现为变量

Django模板变量不呈现

如何在不使用 js 或 html 的情况下摆脱 django 模板变量中的空间和 amp

使用模板变量时,Django 模板不呈现 CSS

在 Google App Engine 中将 docx 文件呈现为 django 模板

将模板变量呈现为 HTML