https://tieba.baidu.com/p/4708382929?red_tag=0827089032
在django中,帶有HTML標簽的字符串,如str = "aa a",我們通過template展示在html頁面中時,django會自動轉義為可顯示的html字符串,即將html標簽的尖括號等字符轉義。
如字符串中的空格會顯示為? ,尖括號會顯示為 <、 >等等。
當我們不需要此自動轉換,如上述str在html頁面直接顯示為aa a時,可通過多種方法禁止django進行自動轉義。
1. 對于單個變量,可以在其后面加上safe過濾器,告訴Django這個字符串不用進行HTML轉義。比如:
This will be escaped: {{ data }}
This will not be escaped: {{ data|safe }}
2.對于一段模板內容可以使用autoescape標簽,比如:
{% autoescape off %}
Hello {{ name }}
{% endautoescape %}
這里的off 參數表明被autoescape包含的信息都不需要執行HTML轉義。on 參數表示需要執行HTML轉義,比如有的時候你希望一段信息中大部分不需要HTML轉義,但是其中某個部分需要HTML轉義,可以這樣:
{% autoescape off %}
This will not be auto-escaped: {{ data }}.
Nor this: {{ other_data }}
{% autoescape on %}
Auto-escaping applies again: {{ name }}
{% endautoescape %}
{% endautoescape %}
另外需要注意的一點是autoescape是存在繼承性的,比如你在父模板中有一個autoescape標簽并且參數為off,那么繼承它的子模板也會在相應的部分繼承這一特性。比如:
# base.html
{% autoescape off %}
{% block title %}{% endblock %}
{% block content %}
{% endblock %}
{% endautoescape %}
# child.html
{% extends "base.html" %}
{% block title %}This & that{% endblock %}
{% block content %}{{ greeting }}{% endblock %}
最后要提一下 字符串的default過濾器,比如下面這個例子:
{{ data|default:"This is a string literal." }}
如果你在default:后面的缺省值中包含了HTML特殊字符,那么是不會被轉義的,比如你應該按照下面第一種的方式來寫,而不是第二種:
# 正確的寫法
{{ data|default:"3 < 2" }}
# 錯誤的寫法
{{ data|default:"3 < 2" }}