1、模板是一個文本,用於分離文檔的表現形式和內容。也可以說是:HTML代碼+模板語法
簡單的例子:使用模板在頁面顯示“hello word”
在template中新建html文件:hello.html, 在views.py中添加對象,向模板中提交數據。在urls.py中添加url與函數對象的映射關系
<h1>{{ hello }}</h1>
from django.shortcuts import render,redirect,HttpResponse
def hello(request):
context={}
context['hello'] = 'Hello World!'
return render(request, 'hello.html', context)
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^hello/', views.index), ]
訪問:http://127.0.0.1:8000/hello 的到如下結果

這樣我們就完成了使用模板來輸出數據,從而實現數據與視圖分離。
2、模板語法之變量:
在模板中變量的語法:用雙大括號 {{ var_name }}
例:在views.py的變量形式
def index(request):
import datetime
s="hello"
l=[111,222,333] # 列表
dic={"name":"yuan","age":18} # 字典
date = datetime.date(1993, 5, 2) # 日期對象
class Person(object):
def __init__(self,name):
self.name=name
person_yuan=Person("yuan") # 自定義類對象
person_egon=Person("egon")
person_alex=Person("alex")
person_list=[person_yuan,person_egon,person_alex]
return render(request,"index.html",{"l":l,"dic":dic,"date":date,"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>
3、模板之過濾器
語法:{{obj|filter__name:param}}
default:如果一個變量是false或者為空,使用給定的默認值。否則,使用變量的值。例如:{{ value|default:"nothing" }}
length:返回值的長度。它對字符串和列表都起作用。例如:{{ value|length }}
filesizeformat:將值格式化為一個 “人類可讀的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:{{ value|filesizeformat }}
date:將值按照給定的方式格式化。{{ value|date:"Y-m-d" }}
safe:Django的模板中會對HTML標簽和JS等語法標簽進行自動轉義,原因顯而易見,這樣是為了安全。但是有的時候我們可能不希望這些HTML元素被轉義,比如我們做一個內 容管理系統,后台添加的文章中是經過修飾的,這些修飾可能是通過一個類似於FCKeditor編輯加注了HTML修飾符的文本,如果自動轉義的話顯示的就是保護HTML標簽的 源文件。為了在Django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變量我們可以通過過濾器“|safe”的方式告訴Django這段代碼是安全的不必轉義。比如:
value="<a href="">點擊</a>"
{{ value|safe}}
4、模板之標簽:
for標簽:遍歷每一個元素, 語法:
{% for person in person_list %}
<p>{{ person.name }}</p>
{% endfor %}
for...empty標簽:for 標簽帶有一個可選的{% empty %} 從句,以便在給出的組是空的或者沒有被找到時,可以有所操作。
{% for person in person_list %}
<p>{{ person.name }}</p>
{% empty %}
<p>sorry,no person here</p>
{% endfor %}
if標簽:{% 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標簽:使用一個簡單地名字緩存一個復雜的變量,當你需要使用一個“昂貴的”方法(比如訪問數據庫)很多次的時候是非常有用的
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
5、自定義標簽和過濾器:
1> 在settings中的INSTALLED_APPS配置當前app,不然django無法找到自定義的simple_tag.
2> 在app中創建templatetags模塊(模塊名只能是templatetags)
3> 創建任意 .py 文件,如:my_tags.py
from django import template from django.utils.safestring import mark_safe register = template.Library() #register的名字是固定的,不可改變 #以上內容是固定格式。 @register.filter #定義一個過濾器
def filter_multi(x,y): #實現一個簡單的乘法函數
return x * y
@register.simple_tag #定義一個標簽
def multi(x,y):
return x * y
4> 在使用自定義simple_tag和filter的html文件中導入之前創建的 my_tags.py
{% load my_tags %}
5> 使用simple_tag和filter(如何調用)
num=10
{{ num|filter_multi:2 }} #經過調用得:20
注意:filter可以用在if等語句后,simple_tag不可以。filter只能接收兩個參數。
6、模板繼承:
Django模版引擎中最強大也是最復雜的部分就是模版繼承,模板繼承簡單理解為通過繼承的方法實現模板(base.html)復用。
簡單的例子:以下文件base.html為模板文件,文件中 {% block mainbody %} {% endblock %} 內需要補充自己需要的內容,子模版可能會覆蓋掉模版中的這些位置。
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <h1>Hello World!</h1> 9 {% block mainbody %} 10 11 {% endblock %} 12 </body> 13 </html>
下面的文件為繼承base.html
1 {% extends "base.html" %} 2 3 {% block mainbody %}<p>繼承了 base.html 文件</p> 4 {% endblock %}
輸出結果:

