只要是在html裏面有模板語法就不是html文件了,這樣的文件就叫作模板。html
模板語法變量:{{ }}
在Django模板中遍歷複雜數據結構的關鍵是句點字符 .(其實就是點號)
views.pypython
from django.shortcuts import render def index(request): name = "Hello world!" number = 101 lst = [1, 2, 3, 4, 5] dic = {"name": "eric", "job": "teacher"} class People: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return self.name + str(self.age) def dream(self): return "你有夢想嗎?" # 實例化 person_jack = People("jack", 10) person_pony = People("pony", 36) person_cent = People("cent", 55) person_list = [person_jack, person_pony, person_cent] return render(request, "index.html", { "name": name, "num": number, "lst": lst, "dic": dic, # 鍵對應的是模板裏的名字,值對應的是上面定義的值 "person_jack": person_jack, "person_pony": person_pony, "person_list": person_list } )
templates/index.html數據庫
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Django 模板</title> </head> <body> <h3>變量{{ variable }}:深度查詢</h3> <h5>{{ name }}</h5> <p>{{ num }}</p> <p>{{ lst }}</p> <p>{{ dic }}</p> <p>{{ lst.0 }}</p> <p>{{ lst.4 }}</p> <p>{{ dic.name }}</p> <p>{{ dic.job}}</p> <p>{{ person_jack.name }}</p> <p>{{ person_jack.age }}</p> <p>{{ person_list.2.name }}</p> </body> </html>
運行輸出結果以下圖所示:django
注意:在使用templates時,須要在django項目的settings配置文件中對templates的路徑作以下配:安全
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # os.path.join(BASE_DIR, "templates"),啓用django模板; # 若是沒有這句會出現"django.template.exceptions.TemplateDoesNotExist: index.html"錯誤 'DIRS': [os.path.join(BASE_DIR, "templates")], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
其中,局點符也能夠用來引用對象的方法(無參數方法)session
<h4>字典:{{ dic.name.upper }}</h4>
模板語法標籤:{% tag %}
標籤語法是:{% tag %},它比變量更加複雜:一些在輸出中建立文本,一些經過循環或者邏輯來控制流程,一些加載其後的變量將使用道德額外信息到模板中。一些標籤須要開始和結束標籤(例如:{% tag %}... 標籤內容...{% endtag %})。
1.for標籤(循環序號能夠經過{{ forloop }}顯示)數據結構
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Django 模板</title> </head> <body> <h3>循環取值</h3><hr> {% for item in person_list %} <p>{{ item.name }}, {{ item.age }}</p> {% endfor %} <h3>循環取值:倒序</h3> {% for item in person_list reversed %} {# 序號從1開始 #} <p>{{ forloop.counter }}---------->{{ item.name }}, {{ item.age }}</p> {# 序號從0開始 #} <p>{{ forloop.counter0 }}---------->{{ item.name }}, {{ item.age }}</p> {# 序號倒序 #} <p>{{ forloop.revcounter }}---------->{{ item.name }}, {{ item.age }}</p> {% endfor %} <h3>循環取值:字典</h3> {% for key, value in dic.items %} <p>{{ key }}, {{ value }}</p> {% endfor %} </body> </html>
運行結果以下圖所示:app
2.for ... empty:for標籤帶有一個可選的{% empty %}從句,以便再給出的組是空的或者沒有被找到時,能夠有所操做函數
{% for person in person_list %} <p>{{ person.name }}</p> {% empty %} <p>sorry,no this person</p> {% endfor %}
3.if標籤:{% if %}會對一個變量求值,若是它的值是"True"(存在、不爲空且不是boolean類型的false值),對應的內容塊被執行oop
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Django 模板</title> </head> <body> {% if num > 200 %} <p>大於</p> {% elif num == 200 %} <p>等於</p> {% else %} <p>小於</p> {% endif %} </body> </html>
4.with:使用一個簡單的名字還出一個複雜的變量,當咱們須要一個"昂貴的"方法(好比:訪問數據庫)不少次的時候是很是有用的
{% with total=business.emlpoyees.count %} {{ total }} empolyee {{ total | pluralize }} % endwith %}
<p>{{ person_list.2.name }}</p> {% with name=person_list.2.name %} <p>{{ name }}</p> {% endwith %}
5.csrf_token:跨站點請求僞造保護
提交數據的時候會作安全機制,當用戶點擊提交的時候會出現一個forbidden錯誤,就是用settings配置裏面的csrf作的安全機制,若是咱們不須要使用,能夠將其註釋。或者在form表單下面添加{% csrf_token %}來解決該問題(這纔是真正的解決辦法,註釋不是解決辦法)。
<h3>scrf_token</h3> <form action="/tag/" method="post"> {% csrf_token %} <p><input type="text" name="haiyan"></p> <input type="submit"> </form>
模板語法過濾器:{{ obj|filter__name:param }},過濾器使用管道字符
1.default:{{ variable| default: "nothing"}},若是變量是false或者爲空,使用默認值。不然,使用變量的值
<p>default過濾器:{{ li|default:"若是顯示爲空,設置解釋性的內容。" }}</p>
2.length:返回值的長度,它對字符串和列表都起做用
{{ value | length }} # 若是value是["a", "b", "c", "d"],那麼輸出是4
3.filesizeformat:將值格式化爲"人類可讀"的文件尺寸(例如:13KB,4.1M,102bytes等等)
{{ value | filesizeformat }} # 若是value是123456789,輸出將會是117.7MB
4.date:格式化日期時間格式
{{ value | date:"Y-m-d" }} # 若是value=datetime.datetime.now(),返回時間的年-月-日格式
5.slice:切片
{{ value | slice:"2:-1" }} # 若是value="hello world",返回'llo worl'
6.truncatechars:截斷
若是字符串字符多於指定的字符數量,那麼會被截斷。截斷的字符串將以可翻譯的省略號序列(...)結尾,參數:要截斷的字符數。
<p>截斷字符: {{ content | truncatechars:20 }}</p> <p>截斷單詞: {{ content | truncatewords:4 }}</p>
若是content是"i am is jack, where are you come from?"
輸出結果:截斷字符: i am is jack, whe...;截斷單詞i am is jack, where...
7.safe
django的模板中會對HTML標籤和JS語法標籤進行自動轉義,這樣是爲了安全。可是有的時候咱們不想這些HTML元素被轉義,好比咱們作一個內容管理系統,後臺添加的文章是通過修飾的,這些修飾多是經過相似於FCKeditor編輯加註了HTML修飾符的文本,若是自動轉義的話顯示的就是保護HTML標籤的源文件。爲了在django中關閉HTML自動轉義有兩種方式,若是是一個單獨的變量咱們能夠經過過濾器"|safe"的方式告訴django這段代碼是安全的沒必要轉義,以下:
value="<a href="">點擊</a>"" {{ value | safe }}
<p>{{ label }}</p> # 爲了安全,系統會把標籤變成字符串 <p>{{ label | safe }}</p> # 加上safe,肯定數據時安全的才能被當成是標籤
這裏簡單介紹經常使用的幾個模板過濾器,更多內容請參考
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'polls.apps.PollsConfig', 'polls.templatetags' # 做爲app註冊 ]
from django import template register = template.Library() # register的名字是固定的,不可改變 @register.filter(name="cut") # 過濾器在模板中使用時的name def custom_cut(value, arg): # 將傳遞過來的參數arg替換爲"#" return value.repalce(arg, "#") @register.tag(name="current_time") def current_time(parse, token): # parse解析器對象,token被解析的對象,包含標籤的名字和格式化的格式 try: tag_name, format_string = token.split_contents() except: raise template.TemplateSyntaxError("syntax") return CurrentNode(format_string[1:-1]) # 傳入模板中的節點類 import datetime class CurrentNode(template.Node): def __init__(self, cus_format): self.format_string = str(cus_format) def render(self, context): now = datetime.datetime.now() return now.strftime(self.format_string)
def index(request): return render(request, "one.html", {"value": "hello world!"})
{% load customtags %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>自定義標籤和過濾器</title> </head> <body> {{ value|cut:"!" }}<br> {% current_time "%Y-%m-%d %H:%M:%S" %} </body> </html>
注意:在模板中不要隨意添加空格,尤爲是變量和標籤
運行結果爲