02.Django-模板
模板
1. 簡介
- 模板由HTML程式碼和邏輯控制程式碼構成
- 同一個模板,可以有多個上下文,就可以通過穿件模板對象來渲染多個上下文
- 創建一個模板就可以多次調用render()方法來渲染上下文
- Django模板解析工作都是在後台通過對正則表達式一次性調用來完成
2. 語法
2.1 模板繼承
include(繼承) 模板標籤
{% include %}
是一個內建模板標籤,允許在模板中包含其他的模板內容- 標籤的參數是所要包含的模板的名稱,可以是一個變數,也可以是單/爽引號硬編碼的字元串
- 在多個模板中出現相同的程式碼時,應該考慮使用
{% include %}
來減少程式碼重複
extend(繼承) 模板標籤
1. 定義母版 {% block title %}......{% endblock %}
2. 定義子板
{% extends "base.html" %} <!--繼承母版的內容,且必須放在模板第一行-->
{% block title %}{% endblock %} <!--所繼承的盒子的內容-->
{% csrf_token %} <!--取消csrf安全保護-->
{{ block.super }} <!--繼承父模板中的內容-->
{% include "小組件路徑" %} <!--HTML出現相同的程式碼時,新建公用小組件HTML文件-->
- 模板繼承是先構造一個基礎模板,而後在子模板中對部分塊進行重載
- 在模板中使用
{% extends %}
,須保證其為模板中的第一個標記,否則模板不起作用 - 一個模板中不能定義多個同名的
{% block %}
- block標籤的工作方式是雙向的,block標籤定義了在父模板中
{% block %}
- 父模板中不能出現兩個相同名稱的
{% block %}
標籤 - 需要訪問父模板中的塊的內容,使用
{{ block.super }}
標籤繼承父模板中的內容
2.2 模板語言的控制語句
-
for 標籤:
循環遍歷可迭代變數中的每一個元素,沒有break和continue等複雜功能,相關操作類比python。
<!--遍歷列表--> {% for name in name_list %} <li>{{ name }}</li> {% endfor %} <!--反向遍歷--> {% for name in name_list reversed %} <li>{{ name }}</**li**> {% endfor %} <!--列表中字典取值--> {% for info_dic in name_list %} <li>{{ info_dic.name }}</li> {% endfor %} <!--遍歷字典--> {% for k,v in info_dict.items %} <li>{{ k }}:{{ v }}</li> {% endfor %}
-
for…empty…:
for遍歷一個空的變數或者未找到時執行empty
{% for info_dic in name_list %} <li>{{ info_dic.name }}</li> {% empty %} <p>給出的變數為空或者未找到!</p> {% endfor %}
-
if 標籤:
判斷變數的邏輯值是進行選擇性的輸出,前後必須要有空格
類比python
<
=
>
<=
>=
!=
==
and
or
not
not in
is
is not
{% if num > 100 %} <h1>大於100</h1> {% elif num < 100 %} <h1>小於100</h1> {% else %} <h1>等於100</h1> {% endif %}
-
with 標籤:
多用於給一個複雜的變數起別名
注意:等號左右不要加空格。
{% with total=business.employees.count %} {{ total }} <!--只能在with語句體內用--> {% endwith %} <!--或--> {% with business.employees.count as total %} {{ total }} {% endwith %}
-
url語句
url標籤中使用模板變數和普通標籤參數一樣,空格隔開,{{ % url 別名 %}}即可。
{% url 'index' %} <!--映射到name為index的請求路徑-->
-
load語句
載入靜態資源
<!--靜態資源路徑--> {% static %} {% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" /> <!--引用JS文件時使用:--> {% load static %} <script src="{% static "mytest.js" %}"></script> <!--某個文件多處被用到可以存為一個變數--> {% load static %} {% static "images/hi.jpg" as myphoto %} <img src="{{ myphoto }}"></img> <!--動態獲取靜態資源路徑--> {% get_static_prefix %} {% load static %} <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" /> <!--或者--> {% load static %} {% get_static_prefix as STATIC_PREFIX %} <img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" /> <img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
-
csrfr_token標籤
{% csrf_token %}
用於生成csrf_token的標籤,用於防治跨站攻擊驗證
如果view的index里用的是render_to_response方法,則不會生效
其實質是生成一個input標籤,然後與其他標籤一起提交給後台
-
verbatin語句
阻止模板語言的渲染
<!--禁止render,原樣渲染--> {% verbatim %} {{ hello }} {% endverbatim %}
-
自定義filter和simply_tag
自定義filter
-
首先在某個app中,創建一個python包,叫做
templatetags
,注意,這個包的名字必須為templatetags
,不然就找不到。 -
在這個
templatetags
包下面,創建一個python文件用來存儲過濾器。 -
在新建的python文件中,定義過濾器(也就是函數),這個函數的第一個參數永遠是被過濾的那個值,並且如果在使用過濾器的時候傳遞參數,那麼還可以定義另外一個參數。但是過濾器最多只能有2個參數。
-
在寫完過濾器(函數)後,要使用
django.template.Library.filter
進行註冊。from Django import template register= template.Library() defgreet(value,word): return value + word register.filter(「greet「(註冊名稱),greet)
-
還要把這個過濾器所在的這個app添加到
settings.INSTALLED_AAPS
中(如果創建應用時已經添加過,就省略這一步) -
在模板中使用
load
標籤載入過濾器所在的python包。 -
{% load [自定義過濾器的文件名] %}
自定義simply_tag
-
在APP下面創建一個包。比如:
template_tag
並在包內創建比如:xx.py
文件。from django import template register = template.Library() @register.simple_tag def my_simple_time(v1): return v1*1000
-
在setting中修改。
INSTALLAPP
加上創建的包名。 -
在html里加一句
{%load template_tag%}
在合適的位置使用標籤{{ my_simple_time 參數 }}
-
2.3 變數的過濾器(filter)的使用
格式
{{ obj | filter : param}}
參數
- add過濾器:
- value與參數相加,若不能轉換成int,則返回空
- cut過濾器:
- 移除value中所有指定的字元串。類似於
python
中的replace()
。
- 移除value中所有指定的字元串。類似於
- date過濾器:
- date將一個日期按照指定的格式,格式化成字元串。
- Y:四位數字年份;m:兩位數字月份;n:月份;d:兩位數字的天;j:天;g:12小時制的小時;G:24小時制的小時;h:12小時制兩位數的小時;H:24小時制兩位數的小時;i:分鐘;s:秒
- default過濾器:
- 如果value為False([],””,None,{},()),則返回參數
- default_if_none過濾器:
- 如果value為None,則返回參數
- first和last過濾器:
- first返回列表/元組/字元串中的第一個元素。
- last返回列表/元組/字元串中的最後一個元素。
- floatformat過濾器:
- floatformat使用四捨五入的方式返回一個浮點類型;參數為X,則保留X位小數。
- join過濾器:
- 類似與
Python
中的join
,將列表/元組/字元串用指定的字元進行拼接。
- 類似與
- length過濾器:
- 獲取一個列表/元組/字元串/字典的長度。
- lower和upper過濾器:
- lower將value中所有的字元全部轉換成小寫。
- upper將value中所有的字元全部轉換成大寫。
- random過濾器:
- 從value中隨機選擇一個值。
- safe過濾器:
- 關閉字元串的自動轉義,如果
value
是一串html
程式碼,那麼將會把這個html
程式碼渲染到瀏覽器中。
- 關閉字元串的自動轉義,如果
- slice過濾器:
- 類似於python中的切片。
- striptags過濾器:
- 刪除字元串中所有的
html
標籤。
- 刪除字元串中所有的
- truncatechars過濾器:
- 參數限制了value的長度,最後一個參數以…作為省略號。
- truncatechars_html過濾器
- 與truncatechars類似,但不會去掉html標籤