django模板系統(上)
filters 過濾 default 替代作用 filesizeformat 格式化為人類可讀 add 給變量加參數 lower 小寫 upper 大寫 title 標題 ljust 左對齊 rjust 右對齊 center 居中 length 返回value的長度 slice 切片 first 取第一個元素 last 取最後一個元素 join 字符串拼接 truncatechars 截斷 date 日期格式化 safe 標簽轉義 自定義filter Tags for for循環可用的一些參數 for ... empty if ,elif 和 else with 定義一個中間變量 csrf_token
常用語法
Django模板中只需要記兩種特殊符號
{{ }} 和 {% %}
{{ }} 表示變量,在模板渲染的時候替換成值,{% %} 表示邏輯相關的操作。
變量
{{ 變量名 }}
變量名由字母數字和下劃線組成。
點(.)在模板中有特殊的含義,用來獲取對象的響應屬性值。
view中代碼:
def template_test(request): l = [11, 22, 33] d = {"name": "alex"} class Person(object): def __init__(self, name, age): self.nameView Code= name self.age = age def dream(self): return "{} is dream...".format(self.name) Alex = Person(name="Alex", age=34) Egon = Person(name="Egon", age=9000) Eva_J = Person(name="Eva_J", age=18) person_list = [Alex, Egon, Eva_J] return render(request, "template_test.html", {"l": l, "d": d, "person_list": person_list})
模板中支持的寫法:
{# 取l中的第一個參數 #} {{ l.0 }} {# 取字典中key的值 #} {{ d.name }} {# 取對象的name屬性 #} {{ person_list.0.name }} {# .操作只能調用不帶參數的方法 #} {{ person_list.0.dream }}
註:當模板系統遇到一個(.)時,會按照如下的順序去查詢:
1. 在字典中查詢
2. 屬性或者方法
3. 數字索引
Filters
翻譯為過濾器,用來修改變量的顯示結果
語法:{{ value|filter_name:參數 }}
“ | 左右沒有空格!沒有空格!!”
default
{{ value|default:"nothing" }}
如果value值沒傳的話就顯示nothing
註:TEMPLATES的OPTIONS可以增加一個選項:string_if_invalid:‘找不到‘,可以替代default的作用。
filesizeformat
將值格式話為一個“人類可讀的”文件尺寸(例如“13KB”,“4.1MB”,等等)。例如
{{ value|filesizeformat }}
如果value是123456789,輸出的將會是117.7MB。
add
給變量加參數
{{ value|add:"2" }}
value是數字4,則輸出結果為6.
{{ first|add:second }}
如果first是【1,2,3】,second【4,5,6】,那輸出結果是【1,2,3,4,5,6】。
lower
小寫
{{ value|lower }}
upper
大寫
{{ value|upper }}
title
標題
{{value|title}}
ljust
左對齊
"{{value|ljust:"10"}}"
rjust
右對齊
"{{value|rjust:"10"}}"
center
居中
"{{value|center:"15"}}"
length
{{ value|length }}
返回value的長度,如value=[ ‘a‘ , ‘b‘ , ‘c‘ , ‘d‘ ]的話,就顯示4
slice
切片
{{value|slice:"2:-1"}}
first
取第一個元素
{{value|first}}
last
取最後一個元素
{{value|last}}
join
使用字符串拼接列表。同python的str.join(list)。
{{value|join:" // "}}
truncatechars
如果字符串字符多於指定的字符數量,那麽會被截斷。截斷的字符串將以可翻譯的省略號序列(“.......”)結尾
參數:截斷的字符數
{{value|truncatechars:9}}
date
日期格式化
{{value|date:"Y-m-d H:i:s"}}
個可視化輸出的字符:點擊查看
safe
Django的模板中會對HTML標簽和JS等語法標簽進行轉義,原因顯而易見,這樣是為了安全。但是有的時候我們可能不希望這些HTML元素被轉義,比如我們做一個內容管理系統,後臺添加的文章中是經過修飾的,這些修飾可能是通過一個類似於FCKeditor編輯加註了HTML修飾符的文本,如果自動轉義的話顯示的就是保護HTML標簽的源文件。為了在django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變量我們可以通過過濾器“|safe”的方式告訴django這段代碼是安全的不必轉義。
比如:
value="<a href=‘#‘>點我</a>"
{{value|safe}}
自定義filter
自定義過濾器只是帶有一個或兩個參數的python函數:
* 變量(輸入)的值 --- 不一定是一個字符串
* 參數的值 --- 這可以有一個默認值,或完全省略
例如,在過濾器{{ var|foo: ‘bar‘ }} 中,過濾器foo將傳遞變量var和參數“bar”
自定義filter代碼文件擺放位置:
app01/ __init__.py models.py templatetags/ # 在app01下面新建一個package package __init__.py app01_filters.py # 建一個存放自定義filter的py文件 views.py
編寫自定義filter
from django import template register = template.Library() @register.filter def fill(value, arg): return value.replace(" ", arg) @register.filter(name="addSB") def add_sb(value): return "{} SB".format(value)
使用自定義filter
{# 先導入我們自定義filter那個文件 #} {% load app01_filters %} {# 使用我們自定義的filter #} {{ somevariable|fill:"__" }} {{ d.name|addSB }}
Tags
for
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul>
for循環可用的一些參數:
Variable | Description |
for loop.counter | 當前循環的索引值(從1開始) |
foo loop.counter 0 | 當前循環的索引值(從0開始) |
for loop.revcounter | 當前循環的倒序索引值(從1開始) |
for loop.revcounter 0 | 當前循環的倒序索引值(從0開始) |
for loop.first | 當前循環是不是第一次循環(布爾值) |
for loop.last | 當前循環是不是最後一次循環(布爾值) |
for loop.parentloop | 本層循環的外層循環 |
for ... empty
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% empty %} <li>空空如也</li> {% endfor %} </ul>
if,elif 和 else
{% if user_list %}
用戶人數:{{ user_list|length }}
{% elif black_list %}
黑名單數:{{ black_list|length }}
{% else %}
沒有用戶
{% endif %}
當然也可以只有if 和 else
{% if user_list|length > 5 %}
七座豪華SUV
{% else %}
黃包車
{% endif %}
if語句支持and,or,==,>,<,!=,<=,>=,in,not in,is,is not 判斷
with
定義一個中間變量
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
csrf_token
這個標簽用於跨站請求偽造保護
在頁面的from表單裏面寫上{% csrf_token %}
註釋
# ... #
註意事項
1.Django的模板語言不支持連續判斷,即不支持以下寫法:
{% if a >b >c %}
...
{% endif %}
2. Django的模板語言中屬性的優先級大於方法
def xx(request): d = {"a":1,"b":2,"c":3,"items":"100"} return render(request,"xx.html",{"data":d})
如上,我們在使用render方法渲染一個頁面的時候,傳的字典d有一個key是items並且還有默認的d.items()方法,此時在模板語言中:
{{data.items}}
默認會取d的items key的值
django模板系統(上)