我正在尝试将视图中的图像返回到Django中的模板。目前我的视图有一个我想要在表中显示的数组,但是以不同的方式(大多数元素作为字符串,但特别是作为图像)
items = [
['an apple', '<img src="apple.png" \\>'],
['a pear', '<img src="pear.png" \\>'],
['an orange', <img src="orange.png" \\>]
]
并在我的模板中
<table>
{% for fruit in items %}
<tr>
{% for element in fruit %}
<td>
{{ element }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
这会打印出文字字符串,而不是显示图像pear.png。
有没有办法告诉模板将元素插入代码而不是呈现为字符串?
答案 0 :(得分:5)
The filter safe
将字符串标记为在输出之前不需要进一步的HTML转义。
<table>
{% for fruit in items %}
<tr>
{% for element in fruit %}
<td>
{{ element | safe }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
旁注:您还可以将商品结构转换为字典,以便更轻松,更清晰地使用:
items = {
'an apple': '<img src="apple.png" />',
'a pear': '<img src="pear.png" />',
'an orange': '<img src="orange.png" />'
}
模板:
<table>
{% for fruit, img in items.items %}
<tr>
<td> {{ fruit }}
<td> {{ img | safe }} </td>
</tr>
{% endfor %}
</table>
最后,您还可以只在dict中添加图片来源,避免使用safe
:
items = {
'an apple': 'apple.png',
'a pear': 'pear.png',
'an orange': 'orange.png'
}
模板:
<table>
{% for fruit, img in items.items %}
<tr>
<td> {{ fruit }}
<td> <img src="{{ img }}" /> </td>
</tr>
{% endfor %}
</table>
答案 1 :(得分:0)
{% for fruit, image_tag in items %}
<td> {{fruit}} </td>
<td> {{image_tag|safe}} </td>
{% endfor %}
您需要将字符串标记为xss protection https://docs.djangoproject.com/en/1.8/ref/templates/language/#automatic-html-escaping
的安全字符如果您不希望在每个网站的每个模板上自动转义数据 级别或每变量级别,您可以通过多种方式将其关闭。
你为什么要把它关掉?因为有时候,模板 变量包含您打算作为原始HTML呈现的数据 在哪种情况下,您不希望其内容被转义。例如, 您可以在数据库中存储一大堆HTML并希望嵌入它 直接进入你的模板。或者,您可能正在使用Django的模板 用于生成不是HTML的文本的系统 - 就像电子邮件消息一样 实例。对于个别变量¶
要禁用单个变量的自动转义,请使用safe 过滤器:
这将被转义:{{data}}这不会被转义:{{ data | safe}}
答案 2 :(得分:-1)
您可以使用
SELECT DISTINCT
u.Name, u.Phone, SUM(o.Amount)
FROM
User u
JOIN
Order o ON u.UserId = o.UserId
WHERE
u.Type = 1 OR u.External = 1
GROUP BY
Name, Phone