一、模板常用語法 1.1 變數 1. 符號:{{ }} 表示變數,在模板渲染的時候替換成值 使用方式:{{ 變數名 }}:變數名由字母數字和下劃線組成 點(.)在模板語言中有特殊的含義,用來獲取對象的相應屬性值 註意:當模板系統遇到一個(.)時,會按照如下的順序去查詢: 在字典中查詢 屬性或者方法 ...
一、模板常用語法
1.1 變數
- 符號:{{ }}
- 表示變數,在模板渲染的時候替換成值
- 使用方式:{{ 變數名 }}:變數名由字母數字和下劃線組成
- 點(.)在模板語言中有特殊的含義,用來獲取對象的相應屬性值
- 註意:當模板系統遇到一個(.)時,會按照如下的順序去查詢:
- 在字典中查詢
- 屬性或者方法
- 數字索引
1.2 內置filter
filter:過濾器,用來修改變數的顯示結果
- 語法: {{ value|filter_name:參數 }}
- ':'左右沒有空格沒有空格沒有空格
內置過濾器
default:預設值
- 語法:{{ value|default:"nothing"}}
- 如果value值沒傳的話就顯示nothing
- 補充:TEMPLATES的OPTIONS可以增加一個選項:string_if_invalid:'找不到',可以替代default的的作用
filesizeformat:文件大小,將值格式化為可讀的文件尺寸
- 語法:{{ value|filesizeformat }}
- 如,value=123456789,輸出將會是 117.7 MB
add:給變數加參數
- 語法:{{ first|add:second }}
- 優先看是否能轉化為數字相加,其次是字元串拼接
- 如果都是列表,相當於extend,迴圈加入
length:返回長度
- 語法:{{ value|length }}
- 返回value的長度,如,value=['a', 'b', 'c', 'd']的話,就顯示4
slice:切片
- 語法:{{value|slice:"2:-1"}}
first / last:取第一個/最後一個元素
- 語法:
- 取第一個元素:{{ value|first }}
- 取最後一個元素:{{ value|last }}
- 語法:
join:使用字元串拼接列表
- 語法:{{ value|join:" // " }}
truncatechars:截斷,按照字元計數
- truncatewords:按照字母計數,不能識別中文
- 如果字元串字元多於指定的字元數量,那麼會被截斷
- 截斷的字元串將以可翻譯的省略號序列(...)結尾
- 參數:截斷的字元
- 語法:{{ value|truncatechars:9}}
date:日期格式化
語法:{{ value|date:"Y-m-d H:i:s"}}
在settings.py中配置:
USE_L10N = False DATETIME_FORMAT = 'Y-m-d H:i:s' # datetime類型 DATE_FORMAT = 'Y-m-d' # date類型 TIME_FORMAT = 'H:i:s' # time類型
配置後,使用{{now}}可以實現日期格式化
- 其中,'now':datetime.datetime.now()
safe:告訴django這段代碼是安全的,不需要轉義
- 語法:{{ value|safe}}
- 如,
value = "<a href='#'>點我</a>"
1.3 自定義filter
在app下創建一個名為templatetags的python包
在templatetags中創建py文件,文件名自定義(my_tags.py);
在py文件中寫:
from django import template register = template.Library() # register也不能變
寫函數+裝飾器
@register.filter def add_xx(value, arg): # 最多有兩個 return '{}-{}'.format(value, arg) @register.filter(name='adds') # 相當於更改了函數名,使用時,使用新的函數名
在模板文件中使用,html文件
{% load my_tags %} {{ 'alex'|add_xx:'dsb' }}
註意:
- 為避免出錯,templatetags最好是一個Python包,並且名稱不能更改
- register名稱也不能更改,必要時需要重啟項目
- Python包下的init中可能有其他內容django不能識別,導致出錯,可以直接刪除內容
1.4 標簽tag
符號:{% %}
for迴圈
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul>
- forloop:字典形式
Variable Description forloop.counter
當前迴圈的索引值(從1開始) forloop.counter0
當前迴圈的索引值(從0開始) forloop.revcounter
當前迴圈的倒序索引值(到1結束) forloop.revcounter0
當前迴圈的倒序索引值(到0結束) forloop.first
當前迴圈是不是第一次迴圈(布爾值) forloop.last
當前迴圈是不是最後一次迴圈(布爾值) forloop.parentloop
本層迴圈的外層迴圈 - for ... empty
{% for book in all_books %} <tr> ..... </tr> {% empty %} <td>沒有相關的數據</td> {% endfor %}
if判斷
- if語句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判斷
{% if 條件1 %} xxx {% elif 條件2 %} xxx {% else %} xxxxx {% endif %}
- 連續判斷
- python中,10>5>1 --> 10>5 and 5>1 --> true
- js中,10>5>1 --> true>1 --> 1>1 --> false
- 模板中,不支持連續連續判斷 也不支持算數運算(可使用過濾器)
with:給變數重命名,但只在with區域內生效
{% with hobby.2 as talk %} {# 相當於 {% with talk=hobby.2 %},其中=兩邊不能有空格 #} {{ talk }} {% endwith %}
csrf_token
- 該標簽用於跨站請求偽造保護
- csrf:跨站請求偽造
- 使用方式:在form表單中寫上{% csrf_token %}
- 這樣就不用在settings中註釋含csrf的中間件了
- 該標簽用於跨站請求偽造保護
1.5 註釋
符號:{# 要註釋的內容 #}
快捷鍵:Ctrl + ?
{# 要註釋的內容 #}
二、母板和繼承
2.1 母板
母板就是一個普通的html,提取多個頁面的公共部分,通過定義block塊來實現
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> {% block page-css %} {% endblock %} </head> <body> <h1>這是母板的標題</h1> {% block page-main %} {% endblock %} <h1>母板底部內容</h1> {% block page-js %} {% endblock %} </body> </html>
block塊:
{% block 塊名 %} {% endblock %}
註意:我們通常會在母板中定義頁面專用的CSS塊和JS塊,方便子頁面替換
2.2 繼承
子頁面繼承母板:{% extends '母板html' %}
{% extends 'layouts.html' %}
子頁面通過重寫block塊,來替換母板中相應的內容
{% block page-main %} <p>世情薄</p> <p>人情惡</p> <p>雨送黃昏花易落</p> {% endblock %}
2.3 註意
- {% extends 'base.html' %}要寫在第一行,前面不要有內容,否則內容會顯示出來
- {% extends 'base.html' %}中的'base.html' 必須加上引號,不然會被當做變數去查找
- 子頁面把要顯示的內容寫在block塊中,否則不會顯示出來
- 多個位置有獨特內容,可以定義多個block塊,特殊:定義css、js塊等
三、組件
組件:一小段html代碼段
可以將常用的頁面內容如導航條,頁尾信息等組件保存在單獨的文件中,然後在需要使用的地方導入
{% include 'navbar.html' %}
四、靜態文件相關
目的:更改setting中靜態文件的別名時,不影響在更改之前的靜態文件的引用,即引用會跟隨別名的更改而自動更改,這樣就不會報錯了
方法一:使用static,原本路徑:/static/images/hi.jpg
{% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi">
- 文件多處被用到可以存為一個變數
{% load static %} {% static "images/hi.jpg" as myphoto %} <img src="{{ myphoto }}">
方法二:使用get_static_prefix,原本路徑:/static/images/hi.jpg
{% load static %} <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi"> {# 補充:獲取別名 #} {% get_static_prefix %}
- 文件多處被用到可以存為一個變數
{% load static %} {% get_static_prefix as STATIC_PREFIX %} <img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi">
五、自定義simple_tag
和自定義filter類似,區別:接收的參數更靈活,能接收萬能參數
定義註冊simple_tag
@register.simple_tag def join_str(*args, **kwargs): return '{} - {} '.format('*'.join(args), '$'.join(kwargs.values())) @register.simple_tag(name='join') # 相當於更改了函數名,使用時,使用新的函數名
使用自定義simple_tag
{% load my_tags %} {% join_str '1' '2' k1='3' k2='4' %}
六、inclusion_tag
在app下的templatetags(python包)中創建py文件,文件名自定義(my_inclusion.py);
在py文件中寫:
from django import template register = template.Library() # register也不能變
寫函數+裝飾器
@register.inclusion_tag('result.html') # result.html 是內容的html def show_results(n): n = 1 if n < 1 else int(n) data = ["第{}項".format(i) for i in range(1, n+1)] return {"data": data}
在result.html中寫:
<ul> {% for choice in data %} <li>{{ choice }}</li> {% endfor %} </ul>
在模板文件中使用
{% load my_inclusion %} {% show_results 10 %}