如何将Django模板变量呈现为HTML?

14
我希望的是像Stack Overflow一样,用户可以使用HTML格式输入文本,并且页面应该以完全相同的方式渲染。 我使用`wmd.js`存储格式化的输入,考虑到我有一个上下文变量`{{variable}}`,其字符串值为`"<p>something</p>"`。当我渲染模板时,请注意:保留HTML标记。
{{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”是什么?它是一个上下文变量吗? - Babu
如果您查看呈现页面的源代码,您会看到&lt;p%gt;something&lt;/&gt;还是<p>something</p> - Burhan Khalid
源代码显示 <p>something</p> - paynestrike
answer.answerbody在数据库中具体包含什么内容?它可能是双重引号或者包含了wmd.js添加的转义字符以确保安全发送到服务器。这样一来,它可能会破坏safe过滤器。 - Babu
4个回答

26

2

您可能希望使用escape函数来呈现它,而不是使用safe函数。

{{ variable|escape }}

@rohan - 他实际上希望它被分段而不是转义。 - Babu

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 %}。有关更多过滤和格式化,请参阅内置模板标签和过滤器


假设用户输入如下内容 "<p>你好,世界</p>",我实际上将其保存为 "<p>你好,世界</p>",现在我想使用该输入呈现模板,所以我做了这个变量 = "<p>你好,世界</p>",{{variable}};现在输出将是 <p>你好,世界</p>,但我不希望<p>标签显示为文本,我需要它呈现为HTML标签,也就是说输出应该是在HTML段落标签中的 "你好,世界"。 - paynestrike
我这样做的原因是因为用户可以格式化他们的输入,这样输出就会完全相同,就像 Stack Overflow 一样,当你发布一个问题时,你会格式化你的输入,它将以相同的格式发布。 - paynestrike
所以你想要一个客户端预览,对吧?那么你在问题中不应该混合使用 {{}},因为它是指从响应中提供的上下文变量。 - Babu
我已经使用了 wmd.js,现在可以预览问题。但是当用户提交问题后,如何以同样的方式呈现服务器响应? - paynestrike
那么 {{variable|safe}} 应该可以工作了。你最好发布你的确切代码。你设置了 {% autoescape on %} 吗? - Babu

0

我认为另一种方法是使用 firstof 标签

请注意,包含在 firstof 标签中的变量不会被转义。这是因为模板标签不会转义其内容。打印变量中包含的任何 HTML 或 Javascript 代码将按原样呈现,这可能会导致安全问题。如果您需要在 firstof 标签中转义变量,则必须显式执行此操作。

{% firstof variable %}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接