从Django中的视图返回HTML元素

时间:2015-12-08 08:55:20

标签: python django

我正在尝试将视图中的图像返回到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。

有没有办法告诉模板将元素插入代码而不是呈现为字符串?

3 个答案:

答案 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