12.35 Django模板系統 {{ }}和 {% %},變數相關的用{{}},邏輯相關的用{%%} app02/views: template_test.html: 在Django的模板語言中,通過使用過濾器來改變變數的顯示,過濾器的語法: {{ value|filter_name:參數 }} ...
12.35 Django模板系統
{{ }}和 {% %},變數相關的用{{}},邏輯相關的用{%%}
app02/views:
# 模板語言測試函數 def template_test(request): name = "張三" dic = {"name": "張三", "age": 16, "items": "sb"} list1 = [11, 22, 33, 44, 55] class Person(object): def __init__(self, name): self.name = name def dream(self): return "{}在做白日夢".format(self.name) p1 = Person("張三豐") import datetime today = datetime.datetime.today() return render( request, "template_test.html", { "name": name, "dic": dic, "list": list1, "obj": p1, "box": "黑盒子", "filesize": 1234567890, "today": today, "str": "<script>alert(123)</script>", "words": """ 先帝創業未半而中道崩殂 """ } )
template_test.html:
{{ dic.name }} {{ dic.age }} #張三 16 {{ dic.items }} #Django的模板語言中屬性的優先順序大於方法的優先順序 sb {{ obj.name }} #張三豐 {{ obj.dream }} #張三豐在做白日夢 模板語言中調用綁定方法不需要加括弧
12.351 過濾器
在Django的模板語言中,通過使用過濾器來改變變數的顯示,過濾器的語法: {{ value|filter_name:參數 }}
使用管道符"|"來應用過濾器
例如:{{ name|lower }}會將name變數應用lower過濾器之後再顯示它的值。lower在這裡的作用是將文本全都變成小寫。
template_test.html:
<body> {{ list }} #[11, 22, 33, 44, 55] {{ list.0 }} #索引取值:11 {{ list|first }} # 11 {{ list|length }} #返回值的長度,作用於字元串和列表 5 {{ list|slice:"2:-1" }} #切片:[33,44] {{ ['a','b']|join:"*" }} #"a*b" {{ box|default:"空盒子" }} #如果box沒有傳值或者值為空的話就顯示預設值,否則使用變數的值 {{ filesize|filesizeformat }} #格式化文件大小 1.1G {{ today|date:"Y-m-d H:i:s" }} #格式化日期格式 {{ str|safe }} #取消轉義,直接應用HTML標簽 {{ words|truncatechars:9 }} #字元串字元多於指定的字元數量會被截斷,截斷的字元串將以(“...”)結尾 {{ words|truncatewords:9}} #在一定數量的字後截斷字元串,截斷的字元串將以(“...”)結尾 {{ i love you|cut:' ' }} #移除value所有的與給出的變數相同的字元串,輸出'iloveyou' {{ 1|add:1 }} # 2 #add可以數字加法,拼接字元串,拼接列表 {{ name|upper }} # NAME </body>
timesince:將日期格式設為自該日期起的時間(例如,“4天,6小時”),blog_date是表示2006年6月1日午夜的日期實例,並且comment_date是2006年6月1日08:00的日期實例,則以下將返回“8小時”:
{{ blog_date|timesince:comment_date }}
12.352 自定義filter
app02: __init__.py models.py templatetags: # 在app02下麵新建一個名為templatetags的(Python package)包 __init__.py app02_filters.py # 建一個存放自定義filter的文件 views.py
編寫自定義filter:
app02_filters.py :
from django import template register = template.Library() # 生成一個用於註冊自定義filter方法的實例 @register.filter(name="sb") def add_sb(value): return "{} sb".format(value) @register.filter(name="cut") def cut(value, arg): return value.replace(arg, "")
template_test.html:
{% load app02_filters %} # 先導入我們自定義filter那個文件 {{ name }} #張三 {{ name|sb }} #張三 sb {{ name|cut:"三" }} #張
註意:
過濾器支持“鏈式”操作。即一個過濾器的輸出作為另一個過濾器的輸入。 過濾器可以接受參數,例如:{{ sss|truncatewords:30 }},這將顯示sss的前30個詞。 過濾器參數包含空格的話,必須用引號包裹起來。比如使用逗號和空格去連接一個列表中的元素,如:{{ list|join:', ' }} ':'左右沒有空格
12.353 simple_tag
和自定義filter類似,但接收更靈活的參數
定義註冊simple_tag:文件名:app01_my_simple_tags
from django import template register = template.Library() # 生成一個用於註冊simple_tag自定義方法的實例 @register.simple_tag(name="plus") def plus(a, b, c): return "{} + {} + {}".format(a, b, c)
使用自定義simple_tag:
{% load app01_my_simple_tags %} {% plus "1" "2" "abc" %} #"12abc"
12.354 inclusion_tag
多用於返回html代碼片段
templatetags/inclusion_tag_test.py:
from django import template register = template.Library() @register.inclusion_tag('result.html') def show_results(n): n = 1 if n < 1 else int(n) data = [ for i in range(1, n+1)] return {"data": data} #用字典給result.html傳值
templates/result.html:
<ul> {% for i in data %} <li>{{ i }}</li> {% endfor %} </ul
templates/index.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>inclusion_tag test</title> </head> <body> {% load inclusion_tag_test %} #導入 inclusion_tag文件 {% show_results 10 %} </body> </html>
12.355 Tags
for迴圈:
<ul> {% for user in user_list %} <li>{{ forloop.counter }}</li> #當前迴圈的索引值(從1開始) <li>{{ forloop.counter0 }}</li> #當前迴圈的索引值(從0開始) <li>{{ forloop.revcounter }}</li> #當前迴圈的倒序索引值(從1開始) <li>{{ forloop.revcounter0 }}</li> #當前迴圈的倒序索引值(從0開始) #{% if forloop.first %} #當前迴圈是不是第一次迴圈(布爾值) {% if forloop.last %} #當前迴圈是不是最後一次迴圈(布爾值) <li>{{ user.name }}</li> {% else %} <li>xxxxx</li> <% endif %> {% empty %} #if語句都沒執行時執行empty xxxxx {% endfor %} </ul>
with: 定義一個中間變數,多用於給一個複雜的變數起別名
{% with total=business.employees.count %} #註意等號左右不要加空格。 {{ total }} employee{{ total|pluralize }} {% endwith %} 或 {% with business.employees.count as total %} {{ total }} employee{{ total|pluralize }} {% endwith %}
for ... empty:
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% empty %} <li>空空如也</li> {% endfor %} </ul>
12.356 母版
新建一個HTML文件(base.html),將公用的標簽放在base.html中作為母版,其他子頁面可以繼承此母版,避免代碼的重覆和多次修改
base.html:
<!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> {#導航條 開始#} {% include 'nav.html' %} {#導航條 結束#} <h1>這是母板的標題</h1> {% block page-content %} {% endblock %} <h1>母板底部內容</h1> {% block page-js %} {% endblock %} </body> </html>
註意:我們通常會在母板中定義頁面專用的CSS塊和JS塊,方便子頁面替換。
繼承母板:
在子頁面中在頁面最上方使用下麵的語法來繼承母板:
{% extends 'base.html' %} {% block page-content %} ..... {% endblock %}
組件:
可以將常用的頁面內容如導航條,頁尾信息等組件保存在單獨的文件中,然後在需要使用的地方按如下語法導入即可:
nav.html:導航條
<nav class="navbar navbar-inverse navbar-fixed-top">
.......
</nav>
xxx.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% include 'nav.html' %} #在使用時通過{% include 組件文件 %}來引入公用組件 <div class="container"> <div class="row"> <div class="page-header "> <h1 class="text-center">新增作者信息</h1> <div class="col-md-6 col-md-offset-3"> ....... </div> </div> </div> </div> </body> </html>