【问题标题】:how to render django template variable as html?如何将 django 模板变量呈现为 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 过滤器。

标签: django string django-templates render html


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

    【讨论】:

      猜你喜欢
      • 2019-06-25
      • 2021-10-28
      • 2017-11-08
      • 2021-08-17
      • 2021-01-25
      • 2021-07-16
      相关资源
      最近更新 更多