何謂轉義?就是把html語言的關鍵字過濾掉。例如,<div>就是html的關鍵字,如果要在html頁面上呈現<div>,其源代碼就必須是<div>
PS:轉義其實就是把HTML代碼給轉換成HTML實體了!
默認情況下,django自動為開發者提供escape功能,即在html代碼render之前,先進行轉義,然后再呈現出來。這樣的話,我們如果想輸出一個鏈接,被轉義之后,可能就無法得到我們想要的結果。
例如,下面的method,如果用戶是匿名用戶,則輸出“匿名用戶”,否則,輸出一個鏈接,指向用戶的profile:
def get_username(self):
return “<a href=’/accounts/%s/’>%s</a>” %(self.user.id, self.user.username)
在template文件中,如果這樣使用上面的方法:
{{topic.get_username}}
這樣,輸出的結果不是一個鏈接,而是上面鏈接轉義后的原文。我們無法得到我們想要的結果。
有以下幾種方法解決自動轉義的問題:
1、filter中
修改filter函數的is_safe屬性:
@register.filter
def myfilter(value):
return value
myfilter.is_safe = True
如果你需要更復雜一些,可以親自來處理escape屬性。
首先,設置filter的need_autoesacpe屬性為True(默認為False),這個參數告訴django,該filter需要一個傳遞一個autoesacape的參數,標示是否需要進行轉義處理,如果為True,則轉義,反之則反。完整的例子如下:
from django.utils.html import conditional_escape
from django.utils.safestring import mark_safe
def initial_letter_filter(text, autoescape=None):
first, other = text[0], text[1:]
if autoescape:
esc = conditional_escape
else:
esc = lambda x: x
result = ‘<strong>%s</strong>%s’ % (esc(first), esc(other))
return mark_safe(result)
initial_letter_filter.needs_autoescape = True
2、template中
去掉template中的自動轉義可以使用filter safe,也可以使用auotescape標簽,還可以修改render的autoescape屬性。
使用safe filter:
This will be escaped: {{ data }}
This will not be escaped: {{ data|safe }}
使用autoescape標簽:
Auto-escaping is on by default. Hello {{ name }}
{% autoescape off %}
This will not be auto-escaped: {{ data }}.
Nor this: {{ other_data }}
{% autoescape on %}
Auto-escaping applies again: {{ name }}
{% endautoescape %}
{% endautoescape %}
如果在autoescape的標簽中include 其他的tags,autoescape的屬性將被子tags繼承。
修改Context類的autoescape屬性:
def render(self, context):
# …
new_context = Context({‘var’: obj}, autoescape=context.autoescape)
注:autoescape標簽的優先級高於Context類的autoescape屬性,即如果Context中autoescape設置與模板中autoescape標簽沖突,則使用autoescape標簽的autoescape設置值。
>>> from django import template
>>> H=’{% autoescape off %}{{div}}{% endautoescape %}’
>>> c = template.Context({’div’:”<div>”}, autoescape=True)
>>> template.Template(H).render(c)
u’<div>’
>>>
>>> H=’{% autoescape on %}{{div}}{% endautoescape %}’
>>> c = template.Context({’div’:”<div>”}, autoescape=True)
>>> template.Template(H).render(c)
u’<div>’
>>> H=’{% autoescape on %}{{div}}{% endautoescape %}’
>>> c = template.Context({’div’:”<div>”}, autoescape=False)
>>> template.Template(H).render(c)
u’<div>’
>>>
3、使用方法函數mark_safe
使用mark_safe函數標記后,django將不再對該函數的內容進行轉義,上面的get_username可以修改為:
from django.utils.safestring import mark_safe
def get_username(self):
return mark_safe(”<a href=’/accounts/%s/’>%s</a>” %(self.user.id, self.user.username))
PS:轉義其實就是把HTML代碼給轉換成HTML實體了!
默認情況下,django自動為開發者提供escape功能,即在html代碼render之前,先進行轉義,然后再呈現出來。這樣的話,我們如果想輸出一個鏈接,被轉義之后,可能就無法得到我們想要的結果。
例如,下面的method,如果用戶是匿名用戶,則輸出“匿名用戶”,否則,輸出一個鏈接,指向用戶的profile:
def get_username(self):
return “<a href=’/accounts/%s/’>%s</a>” %(self.user.id, self.user.username)
在template文件中,如果這樣使用上面的方法:
{{topic.get_username}}
這樣,輸出的結果不是一個鏈接,而是上面鏈接轉義后的原文。我們無法得到我們想要的結果。
有以下幾種方法解決自動轉義的問題:
1、filter中
修改filter函數的is_safe屬性:
@register.filter
def myfilter(value):
return value
myfilter.is_safe = True
如果你需要更復雜一些,可以親自來處理escape屬性。
首先,設置filter的need_autoesacpe屬性為True(默認為False),這個參數告訴django,該filter需要一個傳遞一個autoesacape的參數,標示是否需要進行轉義處理,如果為True,則轉義,反之則反。完整的例子如下:
from django.utils.html import conditional_escape
from django.utils.safestring import mark_safe
def initial_letter_filter(text, autoescape=None):
first, other = text[0], text[1:]
if autoescape:
esc = conditional_escape
else:
esc = lambda x: x
result = ‘<strong>%s</strong>%s’ % (esc(first), esc(other))
return mark_safe(result)
initial_letter_filter.needs_autoescape = True
2、template中
去掉template中的自動轉義可以使用filter safe,也可以使用auotescape標簽,還可以修改render的autoescape屬性。
使用safe filter:
This will be escaped: {{ data }}
This will not be escaped: {{ data|safe }}
使用autoescape標簽:
Auto-escaping is on by default. Hello {{ name }}
{% autoescape off %}
This will not be auto-escaped: {{ data }}.
Nor this: {{ other_data }}
{% autoescape on %}
Auto-escaping applies again: {{ name }}
{% endautoescape %}
{% endautoescape %}
如果在autoescape的標簽中include 其他的tags,autoescape的屬性將被子tags繼承。
修改Context類的autoescape屬性:
def render(self, context):
# …
new_context = Context({‘var’: obj}, autoescape=context.autoescape)
注:autoescape標簽的優先級高於Context類的autoescape屬性,即如果Context中autoescape設置與模板中autoescape標簽沖突,則使用autoescape標簽的autoescape設置值。
>>> from django import template
>>> H=’{% autoescape off %}{{div}}{% endautoescape %}’
>>> c = template.Context({’div’:”<div>”}, autoescape=True)
>>> template.Template(H).render(c)
u’<div>’
>>>
>>> H=’{% autoescape on %}{{div}}{% endautoescape %}’
>>> c = template.Context({’div’:”<div>”}, autoescape=True)
>>> template.Template(H).render(c)
u’<div>’
>>> H=’{% autoescape on %}{{div}}{% endautoescape %}’
>>> c = template.Context({’div’:”<div>”}, autoescape=False)
>>> template.Template(H).render(c)
u’<div>’
>>>
3、使用方法函數mark_safe
使用mark_safe函數標記后,django將不再對該函數的內容進行轉義,上面的get_username可以修改為:
from django.utils.safestring import mark_safe
def get_username(self):
return mark_safe(”<a href=’/accounts/%s/’>%s</a>” %(self.user.id, self.user.username))
- 頂
- 0
- 踩
