2015-09-01 100 views
0

我有一個自定義過濾器,它接受一個字符串並將其轉換爲我正在使用的工具提示庫的相應屬性。它與OpenTip協同工作,但我轉而使用Bootstrap中的工具提示庫。Django模板過濾器轉義

這裏是我的過濾器:

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 %} 

但提示不處理HTML,當我去到螢火蟲並剪切和粘貼的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到頁面中而不被轉義?

回答

0

原來,這個問題比我想象的要糟糕得多 - 我的<script>標籤的順序錯誤,所以我得到的是jQuery-UI工具提示而不是Bootstrap工具提示,而jQuery-UI工具提示並不是' t支持html。

2

嘗試使用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}} 

或者你可以嘗試從您的tooltip標籤移除esc

編輯:

我只是意識到你正在嘗試做的。 您不能將html內部的 tooltip放在引導程序中,它只是一個純文本功能 data-html="true"允許它包含html內容。您也可以使用popover。應該仍然使用safe之上的過濾器來禁用html轉義。

+0

tooltip的文檔說它*可以*使用html。其他人有一個演示它的小提琴:http://jsfiddle.net/44khF/200/所以這是django搞砸了。 –

+0

你說得對,它可以用'data-html =「true」'包含html。然後,你所要做的就是將html內容標記爲安全,並且不會被django轉義。 –

+1

剛剛發現了什麼問題,男孩是我的臉紅。看看我的答案。 –