Django模板筛选器转义

Django模板筛选器转义,django,django-templates,Django,Django Templates,我有一个自定义过滤器,它接受一个字符串,并将其放入我正在使用的工具提示库的相应属性中。它与OpenTip一起工作,但我正在转换为使用Bootstrap中的工具提示库 这是我的过滤器: from django import template from django.utils.html import conditional_escape from django.utils.safestring import mark_safe register = template.Library() @r

我有一个自定义过滤器,它接受一个字符串,并将其放入我正在使用的工具提示库的相应属性中。它与OpenTip一起工作,但我正在转换为使用Bootstrap中的工具提示库

这是我的过滤器:

from django import template
from django.utils.html import conditional_escape
from django.utils.safestring import mark_safe

register = template.Library()


@register.filter(needs_autoescape=False, is_safe=True)
def tooltip(value, autoescape=False):
    """
        Filter to turn some text into the tag that the tooltip library uses -
        Written as a filter so we can switch from one tooltip library to
        another
    """
    if autoescape:
        esc = conditional_escape
    else:
        esc = lambda x: x
    if value is not None and len(value) > 0:
        retval = 'data-toggle="tooltip" data-html="true" ' +\
            'rel="tooltip" title="%s"' % esc(value)
        return mark_safe(retval)
    else:
        return ''
下面是我在模板中使用它的地方:

<form id="filter" name="filter" method="post"
class="form-inline">
{% csrf_token %}
    <label for="filterText">Filter Query:</label>
    <input type="text" id="current_filter" name="current_filter" value="{{current_filter}}" placeholder="Filter" class="span8"/>
    <i class="icon-question-sign"
    {{"Filters -<br>requester: [[first] [last]]|[windows_id]<br>client: [[first] [last]]|[windows_id]<br>approver:  [[first] [last]]|[windows_id]<br>worker: [[first] [last]]|[windows_id]<br>ticket: [id]<br>status: [open]|[closed]|[hold]<br>type: [termination]|[extension]|[access]|[password]|baskets]<br>item: [name for category/item/attribute inventory]<br>since: [mm/dd/yyyy]|[yyyy-mm-dd]<br>before: [mm/dd/yyyy]|[yyyy-mm-dd]<br>All searchs are AND with comma delimiting"|tooltip}}></i>
    <input type="submit" name="btnSubmit" class="btn" value="Filter"/>
    <input id="filter_reset" type="button" name="filter_reset" class="btn" value="Clear existing filters"/>
</form>
{% endif %}

{%csrf_令牌%}
筛选查询:
{%endif%}
但是工具提示没有处理html,当我进入Firebug并剪切和粘贴html时,尽管我用mark_safe标记了它,但它看起来好像有什么东西逃逸了:

<form class="form-inline" method="post" name="filter" id="filter">
<input type="hidden" value="dpuAc9GNUQtvGG5wYzrWsG2Vpu5i7PWJ" name="csrfmiddlewaretoken">
    <label for="filterText">Filter Query:</label>
    <input type="text" class="span8" placeholder="Filter" value="" name="current_filter" id="current_filter">
    <i title="Filters -&lt;br&gt;requester: [[first] [last]]|[windows_id]&lt;br&gt;client: [[first] [last]]|[windows_id]&lt;br&gt;approver:  [[first] [last]]|[windows_id]&lt;br&gt;worker: [[first] [last]]|[windows_id]&lt;br&gt;ticket: [id]&lt;br&gt;status: [open]|[closed]|[hold]&lt;br&gt;type: [termination]|[extension]|[access]|[password]|baskets]&lt;br&gt;item: [name for category/item/attribute inventory]&lt;br&gt;since: [mm/dd/yyyy]|[yyyy-mm-dd]&lt;br&gt;before: [mm/dd/yyyy]|[yyyy-mm-dd]&lt;br&gt;All searchs are AND with comma delimiting" rel="tooltip" data-html="true" data-toggle="tooltip" class="icon-question-sign">
    </i>
    <input type="submit" value="Filter" class="btn" name="btnSubmit">
    <input type="button" value="Clear existing filters" class="btn" name="filter_reset" id="filter_reset">
</form>

筛选查询:

如何在不转义的情况下将筛选文本中的html放入页面?

尝试使用
safe

{{"Filters -<br>requester: [[first] [last]]|[windows_id]<br>client: [[first] [last]]|[windows_id]<br>approver:  [[first] [last]]|[windows_id]<br>worker: [[first] [last]]|[windows_id]<br>ticket: [id]<br>status: [open]|[closed]|[hold]<br>type: [termination]|[extension]|[access]|[password]|baskets]<br>item: [name for category/item/attribute inventory]<br>since: [mm/dd/yyyy]|[yyyy-mm-dd]<br>before: [mm/dd/yyyy]|[yyyy-mm-dd]<br>All searchs are AND with comma delimiting"|safe|tooltip}}
{Filters-
请求者:[[first][last]].[windows_id]
客户端:[[first][last].[windows_id]
批准者:[[first][last].[windows_id]
工作人员:[[first][last].[windows_id]
票证:[id]
状态:[打开][124;[closed].[124;[hold]
键入:[终止][124;[extension]|[access]|[access].[br>密码]
[类别/项目/属性清单的名称]
自:[mm/dd/yyyy]|[yyyy-mm-dd]
之前:[mm/dd/yyyy]|[yyyy-mm-dd]
所有搜索都使用逗号分隔“|安全|工具提示}”
或者,您可以尝试从
工具提示
标记中删除
esc

编辑:


我刚刚意识到你想做什么。你不能把html放在一个in-bootstrap中,它只是一个纯文本功能。
data html=“true”
允许它包含html内容。您也可以使用。为了禁用html转义,仍然应该使用上面的
安全
过滤器。

结果证明问题比我想象的要愚蠢得多-我的
标记顺序错误,所以我得到的是jQuery UI工具提示,而不是引导工具提示,并且jQuery UI工具提示不支持html。

工具提示的文档说它可以使用html。其他人有一把小提琴来演示它:所以它是django搞砸的。没错,它可以包含带有
data html=“true”的html
。然后你所要做的就是将html内容标记为安全的,django不会转义它。只要找出哪里出了问题,我的脸就红了。看看我的答案。