在Django模板中遍歷複雜數據結構的關鍵是句點字符,語法:css
{{var_name}}
views.py:html
import datetime def index(request): s = "hello" l = [111, 222, 333] dic = {"name": "ethan", "age": 18} date = datetime.date(1993, 5, 2) class Person(object): def __init__(self, name): self.name = name person_ethan = Person("ethan") person_linda = Person("linda") person_tom = Person("tom") person_list = [person_ethan, person_linda, person_tom] return render(request, "index.html", {"l": l, "dic": dic, "person_list": person_list})
template:數據庫
<h4>{{s}}</h4> <h4>列表:{{ l.0 }}</h4> <h4>列表:{{ l.2 }}</h4> <h4>字典:{{ dic.name }}</h4> <h4>日期:{{ date.year }}</h4> <h4>類對象列表:{{ person_list.0.name }}</h4>
句點符也能夠用來引用對象的方法(無參數方法):django
<h4>字典:{{ dic.name.upper }}</h4>
語法:緩存
{{ obj|filter_name: param }}
若是一個變量是false或者爲空,使用給定的默認值。不然,使用變量的值。如:安全
{{ value|default: "nothing" }}
返回值的長度,它對字符串和列表都起做用。如:數據結構
{{ value|length }}
若是value是["a", "b", "c", "d"],那麼輸出爲4app
將值格式化爲一個"可讀的"文件尺寸(例如"13KB", "4.1MB", "102bytes",等等)。如:ide
{{ value|filesizeformat }}
若是value是123456789, 輸出將會是117.7MBoop
若是value = datetime.datetime.now()
{{ value|date: "Y-m-d" }}
若是 value = "hello world"
{{ value|slice: "2:-1" }} llo worl
若是字符串字符多於指定的字符數量,那麼會被截斷。截斷的字符串將以可翻譯的省略號序列("...")結尾
參數:要截斷的字符數
如:
{{ value|truncatechars:9 }}
Django的模板中會對HTML標籤和JS等語法標籤進行自動轉義,緣由顯而易見,這樣是爲了安全。可是有的時候咱們可能不但願這些HTML元素被轉義,好比咱們作一個內容管理系統,後臺添加的文章中是通過修飾的,這些修飾多是經過一個相似於FCKeditor編輯加註了HTML修飾的文本,若是自動轉義的話顯示的就是保護HTML標籤的源文件。爲了在Django中關閉HTML的自動轉義有兩種方式,若是是一個單獨的變量能夠經過過濾器"|safe"方式告訴Django這段代碼是安全的,沒必要轉義。如:
value = "<a href="">點擊</a>" {{ value|safe }}
遍歷每個元素:
{% for person in person_list %} <p>{{ person.name }}</p> {% endfor%}
反向遍歷:
{% for obj in list reversed %} <p>{{ person.name }}</p> {% endfor %}
遍歷字典:
{% for key, val in dic.items %} <p>{{ key }}: {{ val }}</p> {% endfor %}
循環序號能夠經過{{ forloop }}顯示
forloop.counter The current iteration of the loop (1-indexed)
forloop.counter0 The current iteration of the loop (0-indexed)
forloop.revcounter The number of iterations from the end of the loop (1-indexed)
forloop.revcounter0 The number of iterations from the end of the loop (0-indexed)
forloop.first True if this is the first time through the loop
forloop.last True if this is the last time through the loop
for標籤帶有一個可選的{% empty %}從句,以便給出的組是空的或者沒有被找到時,能夠有所操做
{% for person in person_list %} <p>{{ person.name }}</p> {% empty %} <p>sorry, no person here</p> {% endfor %}
{% if %}會對一個變量求值,若是它的值是"True"(存在、不爲空、且不是boolean類型的false值),對應的內容塊會輸出
{% if num > 100 or num < 0 %} <p>無效</p> {% elif num > 80 and num < 100 %} <p>優秀</p> {% else %} <p>湊合吧</p> {% endif %}
使用一個簡單的名字緩存一個複雜的變量,當須要使用一個"昂貴的"方法(好比訪問數據庫)不少次的時候是很是有用的
{% with total = business.employees.count %}
{{ total }} employee {{ total|pluralize }}
{% endwith %}
這個標籤用於跨站請求僞造保護
{% csrf_token %}
# my_tags.py: from django import template from django.utils.safestring import mark_safe register = template.Library() # register的名字是固定的,不可改變 @register.filter def filter_multi(v1, v2): return v1 * v2
# my_tags.py: @register.simple_tag def simple_tag_multi(v1, v2): return v1 * v2
{% load my_tags %}
# num=12 {{ num|filter_multi:2}} # 24 {% simple_tag_multi 2 5 %} # 參數不限,但不能放在if for語句中
filter能夠用在if等語句後,simple_tag不能夠
{% if num|filter_multi:30 > 100%}
{{ num|filter_multi:30}}
{% endif %}
模板繼承可讓您建立一個基本的"骨架"模板,它包含您站點中的所有元素,而且能夠定義可以被子模板覆蓋的blocks
base.html:
<!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="style.css" /> <title>{% block title %}My amazing site{%/span> endblock %}</title> </head> <body> <div id="sidebar"> {% block sidebar %} <ul> <li><a href="/">Home</a></li> <li><a href="/blog/">Blog</a></li> </ul> {% endblock %} </div> <div id="content"> {% block content %}{% endblock %} </div> </body> </html>
子模板:
{% extends "base.html" %} {% block title %}My amazing blog{% endblock %} {% block content %} {% for entry in blog_entries %} <h2>{{ entry.title }}</h2> <p>{{ entry.body }}</p> {% endfor %} {% endblock %}
使用繼承時:
{% block content %}
...
{% endblock content %}