第一章 Django
五、模板
1. 概述
Django
中的模板是指可以動態生成任何基于文本格式文件的技術(如HTML
、CSS
等)。
Django
中內置了自己的模板系統,稱為DTL(Django Template Language), Django模板語言
。
2. 配置
settings.py
中關于模板的配置如下:
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates',# 指定模板文件存儲的位置'DIRS': [ 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',],},},
]
3. 渲染模板
在Django
的模板系統中,可通過render()
函數來完成渲染模板的功能。
其語法結構是:
from django.shortcuts import renderrender(request,template_name,content=None,content_type=None,status=None)
request
代表用于生成此響應的請求對象template_name
代表要渲染的模板文件的名稱content
代表要傳遞到模板的數據形成的數據字典content_type
代表模板文件的MIME
類型,默認為text/html
status
代表響應的狀態碼,默認為200
render()
函數返回HttpResponse
對象,是更加簡潔的輸出。
六、DTL
DTL
中的語法涉及四個部分:
- 注釋 – 注釋
- 變量 – 變量在模板被執行時將被替換為實際值 – {{ … }}
- 標簽 – 用于控制模板邏輯 {% … %}
- 過濾器 – 用于轉換變量或標簽的值
1. 變量
在DTL
中的變量通過雙花括號進行訪問:
{{ variable }}
{{ variable.key }}
{{ variable.index }}
{{ variable.property }}
views.py
的代碼如下:
def variable(request):username = 'Tom'age = 23sex = Truescore = {'chinese':128,'math':149,'english':122}friends = ['John','Rose','Frank','Ben']return render(request,'variable.html',locals())
variable.html
的代碼如下:
<body><h1>Variable</h1><p>username:{{ username }}</p><p>age:{{ age }}</p><p>sex:{{ sex }}</p><p>chinese:{{ score.chinese }}</p><p>math:{{ score.math }}</p><p>english:{{ score.english }}</p><p>{{ friends.0 }},{{ friends.1 }},{{ friends.2 }},{{ friends.3 }}</p></body>
2. 標簽
2.1 for
for
標簽用于遍歷列表或字典,語法結構是:
{% for iterate_value in sequence %}......
{% endfor %}{% for iterate_value in sequence %}......
{% empty%}......
{% endfor %}
for
循環中內置了一組變量供用戶使用:
變量 | 描述 |
---|---|
forloop.counter | 循環記數器,從1開始 |
forloop.counter0 | 循環記數器,從0開始 |
forloop.revcounter | 反向循環記數器,最后一個為1 |
forloop.revcounter0 | 反向循環記數器,最后一個為0 |
forloop.first | 當前循環為第一個時,該變量值為True |
forloop.last | 當前循環為最后一個時,該變量值為True |
views.py
的代碼如下:
def forloop(request):books = [{'bookname': '孫子兵法大全集(超值金版)','price': 18.4,'publishing': '新世界出版社','category': '歷史'},{'bookname': '甲骨文叢書·拿破侖大帝(全2冊) ','price': 119.5,'publishing': '中信出版集團','category': '傳記'},{'bookname': 'JavaScript DOM編程藝術(第2版)','price': 42.70,'publishing': '人民郵電出版社','category': '計算機'},{'bookname': '精通iOS開發 第8版','price': 102.20,'publishing': '人民郵電出版社','category': '計算機'},{'bookname': 'UNIX網絡編程 卷1 套接字聯網API(第3版)','price': 102.9,'publishing': '人民郵電出版社','category': '計算機'},{'bookname': '曾國藩的正面與側面:1+2(套裝共兩冊)','price': 59.30,'publishing': '岳麓書社','category': '傳記'},{'bookname': '普京傳:不可替代的俄羅斯硬漢 [Mr.Putin: Operative In The Kremlin] ','price': 39,'publishing': '紅旗出版社','category': '傳記'},]context = {'books':books}return render(request,'forloop.html',context)
forloop.html
的代碼如下:
<table width="900" cellpadding="10" celspacing="0" border="1"><tr><td>序號</td><td>書名</td><td>價格</td><td>出版社</td><td>分類</td></tr>{% for book in books %}<tr><td>{{ forloop.counter }}</td><td>{{ book.bookname }}</td><td>{{ book.price }}</td><td>{{ book.publishing }}</td><td>{{ book.category }}</td></tr>{% endfor %}</table>
2.2 cycle
在每次遇到cycle
標記時,都會產生一個參數。第一次產生第一個參數,第二次產生第二個參數,依次類推。一旦用盡所有參數,再次循環時則產生第一個參數。其語法結構是:
{% cycle 'value1' 'value2' 'value3' '...'%}
2.3 if
{% if condition %}...
{% endif %}或者{% if condition %}...
{% else %}...
{% endif %}或者{% if condition %}...
{% elif condition %}...
{% elif condition %}...
{% else %}...
{% endif %}
2.4 templatetag
基本語法結構是:
{% templatetag templatebit %}
模板位(templatebit ) | 說明 |
---|---|
openblock | {% |
closeblock | %} |
openvariable | {{ |
closevariable | }} |
opencomment | {# |
closecomment | #} |
2.5 verbatim
verbatim
標簽用于告訴DTL
停止渲染此標簽內的內容,其語法是:
{% verbatim%}...
{% endverbatim %}
2.6 url
url
標簽用于近回與指定路由和可選參數相匹配的絕對路徑引用(不包括域名),其格式為:
{% url 'route_name' arg1 arg2 .. %}
2.7 include
include
標簽用于在一個模板文件中包含另外一個模板文件,其語法結構是:
{% include 'filename' %}
2.8 csrf_token
csrf_token
稱為令牌標簽,其作用是為了防止跨域請求偽造,其原理是表單內添加一個隱藏域,其值為加密信息,在表單POST
提交時將與服務器產生的加密信息進行匹配,匹配成功則意味合法用戶。
{% csrf_token %}
3. 過濾器
過濾器用于轉換變量或標簽參數的值,其語法結構是:
{{ value | filter}}
3.1 safe
safe
用于標記一個字符串在輸出前不需要對HTML
標記進行轉義,語法結構是:
{{ value | safe }}
3.2 truncatechars
用于完成字符串的截取,其語法結構是:
{{ value | truncatechars:長度 }}
3.3 yesno
將True
,False
和None
(可選)值映射到以英文逗號分隔的數據,其結構為:
{{ value | yesno:"True時的值,False時的值,None時的值"}}