0

我有一个从数据库传递信息的视图:

def serve_article(request, id):
    served_article = Article.objects.get(pk=id)

    # Strips out new line and tab characters
    article_snippet = served_article.full_text.replace('\n','').replace('\t','')

    # Gets first 300 word characters
    article_snippet = re.match(r'(.{,300})\W', article_snippet).group(1)

    return render(request, 'article.html', {'served_article':served_article,
                                            'article_snippet':article_snippet})

article_snippet, 渲染时的 unicode 字符串,包含许多 HTML 实体代码(例如:’映射到 ' 并©在渲染时映射到 ©)

但是,{{ article_snippet }}在模板中不会评估这些符号,将它们留空,就好像它们被包裹在<code>标签中一样(它们不是)。

<meta charset="utf-8">在顶部,页面上的其他符号评估良好,很明显这些符号正在以某种方式被转义。为什么会发生这种行为,如何禁用它?

4

3 回答 3

2

要禁用单个变量的自动转义,请使用safe过滤器:

This will be escaped: {{ data }}
This will not be escaped: {{ data|safe }}

https://docs.djangoproject.com/en/dev/topics/templates/

确保您的变量不包含用户提供的危险 HTML(<script>标签等)。

于 2012-07-07T23:55:55.527 回答
2

Riateche 建议使用安全过滤器,它会在 90% 的时间为您服务,其他时候(需要将 HTML 格式化为消息 - 使用 django 消息传递框架)您需要能够手动完成。

手动使字符串安全:https ://docs.djangoproject.com/en/1.4/ref/utils/#django.utils.safestring.mark_safe

from django.utils.safestring import mark_safe

def serve_article(request, id):
    served_article = Article.objects.get(pk=id)

    # Strips out new line and tab characters
    article_snippet = served_article.full_text.replace('\n','').replace('\t','')

    # Gets first 300 word characters
    article_snippet = re.match(r'(.{,300})\W', article_snippet).group(1)

    # MARK THIS VALUE AS SAFE IN YOUR VIEW
    article_snippet = mark_safe(article_snippet)

    return render(request, 'article.html', {'served_article':served_article,
                                        'article_snippet':article_snippet})
于 2012-07-08T00:01:14.277 回答
0

我在 Django V1.9 中发现,如果您将安全模板标签堆叠在其他模板标签之后,它就不起作用,因此请确保安全位于上下文变量之后!

.py 代码

context['variable'] = "&trade;"

HTML

以下作品

{{ variable|safe|capfirst|linebreaksbr }} -> displays: TM

以下不起作用

{{ variable|capfirst|linebreaksbr|safe }} -> displays: &trade;
于 2016-06-30T06:50:47.927 回答