將頁面的設計和python的代碼分離開會更乾淨建簡介維護。咱們可使用Django的模板系統(Template System)來實現
css
變量:{{ 變量名 }}
1 深度查詢
2 過濾器
標籤:{% %}html
模板語言分爲兩種:python
1 變量
句點符,深度查詢(能夠點到方法,不要加括號,只能是無參的方法)數據庫
2 過濾器django
語法: 冒號後不能加空格,now是第一個參數,冒號後面是第二個參數緩存
{{obj|filter__name:param}} 變量名字|過濾器名稱:變量
例如:{{now|date:’Y-m-d H:i:s’}}
經常使用過濾器:app
若是一個變量是false或者爲空,使用給定的默認值。不然,使用變量的值。例如:xss
{{ value|default:
"nothing"
}}
函數
返回值的長度。它對字符串和列表都起做用。例如:oop
{{ value|length }}
若是 value 是 ['a', 'b', 'c', 'd'],那麼輸出是 4。
將值格式化爲一個 「人類可讀的」 文件尺寸 (例如 '13 KB'
, '4.1 MB'
, '102 bytes'
, 等等)。例如:
{{ value|filesizeformat }}
{{ 1024|filesizeformat }}
若是 value
是 123456789,輸出將會是 117.7 MB
。
若是 value=datetime.datetime.now()
{{ value|date:
"Y-m-d H:i:s"
}}
若是 value="hello world"
{{ value|
slice
:
"2:-1"
}}
若是字符串字符多於指定的字符數量,那麼會被截斷。截斷的字符串將以可翻譯的省略號序列(「...」)結尾。
參數:要截斷的字符數
例如:
{{ value|truncatechars:
9
}}
ss3
=
"<a href="
">點擊</a>"
{{ value|ss3}}
xss攻擊:跨站腳本攻擊
#能夠在視圖函數處理
from django.utils.safestring import mark_safe
ss3 = mark_safe(ss3)
倆參數能夠傳字符串和數字, 給value加上一個數值
add過濾器: {{ 12|add:"3" }}
add過濾器: {{ 'eee'|add:"3rrr" }}
3 標籤 Tag
標籤看起來像是這樣的: {% tag %}
。標籤比變量更加複雜:一些在輸出中建立文本,一些經過循環或邏輯來控制流程,一些加載其後的變量將使用到的額外信息到模版中。一些標籤須要開始和結束標籤
(例如{% tag %} ...
標籤 內容 ... {% endtag %})。
for標籤
遍歷每個元素:
{% for book in book_list %}
<p>{{ book.name }}</p> 必須在for循環裏使用
{% endfor %}
能夠利用{% for obj in list reversed %} 反向完成循環
遍歷一個字典:
{% for key,val in dic.items %}
<p>{{key}}:{{val}}</p>
{% endfor %}
循環序號能夠經過{{forloop }}實現
forloop.counter The current iteration of the loop (1-indexed) 當前循環的索引值(從1開始)
forloop.counter0 The current iteration of the loop (0-indexed) 當前循環的索引值(從0開始)
forloop.revcounter The number of iterations from the end of the loop (1-indexed) 當前循環的倒序索引值(從1開始)
forloop.revcounter0 The number of iterations from the end of the loop (0-indexed) 當前循環的倒序索引值(從0開始)
forloop.first True if this is the first time through the loop 當前循環是否是第一次循環(布爾值)
forloop.last True if this is the last time through the loop 當前循環是否是最後一次循環(布爾值)
forloop.parentloop 本層循環的外層循環
for…empty
for 標籤帶有一個可選的{% empty %} 從句,以便在給出的組是空的或者沒有被找到時,能夠有所操做。
{% for person in person_list %}
<p>{{ person.name }}</p>
{% empty %}
<p>sorry,no person here</p>
{% endfor %}
if 標籤
{% if %}會對一個變量求值,若是它的值是「True」(存在、不爲空、且不是boolean類型的false值),對應的內容塊會輸出。
{% if num > 100 or num < 0 %}
<p>無效</p>
{% elif num > 80 and num < 100 %}
<p>優秀</p>
{% else %}
<p>湊活吧</p>
{% endif %}
if 語句支持 and 、or 、== 、> 、 < 、<= 、>= 、in 、not in 、is 、is not 判斷
with
使用一個簡單地名字緩存一個複雜的變量,當你須要使用一個「昂貴的」方法(好比訪問數據庫)不少次的時候是很是有用的
{% with aa=dic.name%}
{{aa}}
{%endwith%}
能夠寫成as
{% with dic.name as aa%}
{{aa}}
{%endwith%}
csrf_token
{% csrf_token %}
這個標籤用於跨站請求僞造保護
4 自定義標籤和過濾器
- 在settings中的INSTALLED_APPS配置當前app,否則django沒法找到自定義的simple_tag.
- 在app中建立templatetags模塊(模塊名只能是templatetags)
- 建立任意 .py 文件,如:my_tags.py
from django import template 4. 導入template
from django.utils.safestring import mark_safe
register = template.Library() #register的名字是固定的,不可改變 5.register
(6.寫函數 用@register.filter @register.simple_tag 裝飾)
@register.filter 過濾器
def filter_multi(v1,v2):
return v1 * v2
@register.simple_tag
def simple_tag_multi(x,y,z):
return x+y+z
----------------
能夠指定名字(可選)
@register.simple_tag(name=’xxx’)
7. 在使用自定義simple_tag和filter的html文件中導入以前建立的 my_tags.py
{% load my_tags %}
8. 使用simple_tag和filter(如何調用)
-------------------------------.html
{% load my_tags %}
# num=12
{{ num|filter_multi:2 }} #24 最多隻能傳兩個參數
{% simple_tag_multi 2 5 10 %} #17 以空格作分割,傳參數。 參數不限,但不能放在if for語句中
或者
{% xxx 2 5 10 %}
5 靜態文件引入的三種方式:
一:
<link rel="stylesheet" href="/static/dd/ssmycss.css">
二:
{% load static %}
<link rel="stylesheet" href="{% static 'dd/ss/mycss.css' %}">
{# 返回值:/static/dd/ss/mycss.css#}
三:
{% load static %}
<link rel="stylesheet" href="{% get_static_prefix %}dd/ss/mycss.css">
6 模板導入和繼承
模板導入:
1 把公共部分,放到html裏,好比叫 left.html
2 想在哪裏用 {% include '模板名稱' %} 如 {% include 'left.html' %}
模板繼承:
1 寫一個模板 base.html
2 要更改的地方
{% block base %}
母版的盒子裏也能夠寫東西
{% endblock %}
3 調用
3.1 寫在第一行 {%extends 'base.html' %}
3.2 {% block base %}
本身的東西
{% endblock my_head%}
3.3 還想用母版裏的內容({{block.super}} 放在那,原來母版裏的東西,就會渲染在哪)
{% block base %}
{{block.super}}
本身的東西
{% endblock my_head%}
3.4 如過不繼承盒子,它會用原來的內容,若是繼承了,沒寫本身的東西,它會空白
3.5 盒子再繼承時,跟順序無關
7 自定義 inclusion_tag
多用於返回html代碼片斷
1 先去setting裏面把app名字配置上
2 再app目錄下建立一個templatetags模塊
3 寫py文件(my_test.py)
4 from django import template
5 register=template.Library()
6 @register.inclusion_tag('test.html')
def my_inclusion(n):
data=[]
for i in range(n):
data.append('第%s行'%i)
return {'data':data}
7 寫test.html頁面
<ul>
{% for choice in data %}
<li>{{ choice }}</li>
{% endfor %}
</ul>
8 {% load my_test %}
9 {% my_inclusion 10 %} 它會返回html的頁面