我有一个从数据库传递信息的视图:
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">
,页面上的其他符号评估良好,所以显然这些符号正在以某种方式转义。为什么会发生这种行为?如何禁用它?
要禁用单个变量的自动转义,请使用
safe
过滤器:
This will be escaped: {{ data }}
This will not be escaped: {{ data|safe }}
https://docs.djangoproject.com/en/dev/topics/templates/
确保您的变量不包含用户提供的危险 HTML(
<script>
标签等)。
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})
我在 Django V1.9 中发现,如果将 safe 模板标签堆叠在其他模板标签之后,它不起作用,因此请确保 safe 直接位于上下文变量之后!
.py代码
context['variable'] = "™"
HTML
以下作品
{{ variable|safe|capfirst|linebreaksbr }} -> displays: TM
以下内容不起作用
{{ variable|capfirst|linebreaksbr|safe }} -> displays: ™
最常见的错误是给出错误的 复制并粘贴正确的链接 即,访问 www.angular js org 点击下载角度js 复制 CDN 链接 粘贴到前面 所以这会给你正确的 html 评估答案..