將Python嵌入到HTML中。
將HTML硬解碼到視圖並非那麼完美緣由以下:css
模板:HTML代碼+模板語法html
def current_time(req): # ================================原始的視圖函數 # import datetime # now=datetime.datetime.now() # html="<html><body>如今時刻:<h1>%s.</h1></body></html>" %now # return HttpResponse(html) #另外一種寫法(推薦) import datetime now=datetime.datetime.now() return render(req, 'current_datetime.html', {'current_date':str(now)[:19]})
模板語法的重點:python
變量:{{ 變量名 }} 1.深度查詢用句點符 2.過濾器 標籤:{% %}
{# this won't be rendered #} 單行註釋
註釋多行使用comment標籤git
在django模板中遍歷複雜數據結構的關鍵是句點字符,語法:{{ 變量名 }}。變量相似於python中的變量。數據庫
變量的命名包括任何字母數字以及下劃線("_")的組合。點(".")也有可能會在變量名中出現,不過它有特殊的含義。最重要的是,變量名稱中不能有空格或標點符號。
views.py:django
name='abc' age=18 li=[1,2,'3','4'] dic={'name':'abc','age':18,''li:[1,2,4]} def test(): #函數 print('abc') return 'abchahahah' class Person(): def __init__(self,name,age) self.name=name self.age=age def get_name(self): return self.name @classmethod def cls_test(cls): return 'cls' @staticmethod def static_test(): return 'static' --------- # 模板裏不支持帶參數 def get_name_cs(self,ttt): return self.name ---------- zfj=Person('zfj',18) qer=Person('qwe',28) person_list=[zfj,qwe]
html:緩存
至關於print了該變量安全
<p>字符串:{{ name }}</p> <p>數字:{{ age }}</p> <p>列表:{{ li }}</p> <p>元祖:{{ tu }}</p> <p>字典:{{ dic }}</p> <p>函數:{{ test }}</p> {#只寫函數名:至關於函數名(),返回函數執行結果#} <p>對象:{{ zfj }}</p> {#對象內存地址#}
深度查詢:服務器
<p>列表第1個值:{{ ll.0 }}</p> <p>列表第4個值:{{ ll.3 }}</p> <p>字典取值:{{ dic.name }}</p> <p>字典取列表值:{{ dic.li }}</p> <p>對象取數據屬性:{{ zfj.name }}</p> <p>對象取綁定給對象的函數屬性:{{ zfj.get_name }}</p> <p>對象取綁定給類的函數屬性:{{ zfj.cls_test }}</p> <p>對象取靜態方法:{{ zfj.static_test }}</p>
語法:數據結構
{{變量名|過濾器名稱:屬性值}}
過濾器能夠「連接」,一個過濾器的輸出應用於下一個過濾器{{text|escape|linebreaks}}
,先轉移文本內容,而後把文本轉成<p>
標籤。
注:過濾器參數包含空格,必須用引號抱起來。
過濾器 | 說明 |
---|---|
add | 加法 |
addslashes | 添加斜槓 |
capfirst | 首字母大寫 |
center | 文本居中 |
cut | 切除字符 |
date | 日期格式化 |
default | 設置默認值 |
default_if_none | 爲None設置默認值 |
dictsort | 字典排序 |
dictsortreversed | 字典反向排序 |
divisibleby | 整除判斷 |
escape | 轉義 |
escapejs | 轉義js代碼 |
filesizeformat | 文件尺寸人性化顯示 |
first | 第一個元素 |
floatformat | 浮點數格式化 |
force_escape | 強制馬上轉義 |
get_digit | 獲取數字 |
iriencode | 轉換IRI |
join | 字符列表連接 |
last | 最後一個 |
length | 長度 |
length_is | 長度等於 |
linebreaks | 行轉換 |
linebreaksbr | 行轉換 |
linenumbers | 行號 |
ljust | 左對齊 |
lower | 小寫 |
make_list | 分割成字符列表 |
phone2numeric | 電話號碼 |
pluralize | 複數形式 |
pprint | 調試 |
random | 隨機獲取 |
rjust | 右對齊 |
safe | 安全確認 |
safeseq | 列表安全確認 |
slice | 切片 |
slugify | 轉換成ASCII |
stringformat | 字符串格式化 |
striptags | 去除HTML中的標籤 |
time | 時間格式化 |
timesince | 從什麼時候開始 |
timeuntil | 到什麼時候多久 |
title | 全部單詞首字母大寫 |
truncatechars | 截斷字符 |
truncatechars_html | 截斷字符 |
truncatewords | 截斷單詞 |
truncatewords_html | 截斷單詞 |
unordered_list | 無序列表 |
upper | 大寫 |
urlencode | 轉義url |
urlize | url轉成可點擊的連接 |
urlizetrunc | urlize的截斷方式 |
wordcount | 單詞計數 |
wordwrap | 單詞包裹 |
yesno | 將True,False和None,映射成字符串‘yes’,‘no’,‘maybe’ |
若是變量是false或者爲空,則使用給定的默認值。
{{ value|default:'nothing'}}
返回值的長度,對字符串和列表都起做用
{{ value|length}}
若是value是[1,2,3,4]
,那麼輸出是4
將值格式化成'人類可讀的'文件尺寸。例如: {{1024|filesizeformat}} 輸出爲1kb
若是value=datetime.datetime.now()
{{ value|date:"Y-m-d"}}
切片
{{ name|slice:'0:3:3' }}
若是字符串多餘指定字符數量,多餘會被截斷,替換成("...")結尾。
{{ value|truncatechars:9}}
Django模板爲了安全默認會對HTML標籤和js等語法標籤進行轉義,有時候咱們不但願這些元素被轉義,能夠經過設置過濾器。
script="'<script>alert(111)</script>" {{ script|safe }}
一些在輸出中建立文本,一些經過循環或邏輯來控制流程,一些加載其後的變量將使用到的額外信息到模版中。一些標籤須要開始和結束標籤 (例如{% tag %} ...標籤 內容 ... {% endtag %})。 {% tag %}
標籤 | 說明 |
---|---|
autoescape | 自動轉義開關 |
block | 塊引用 |
comment | 註釋 |
csrf_token | CSRF令牌 |
cycle | 循環對象的值 |
debug | 調試模式 |
extends | 繼承模版 |
filter | 過濾功能 |
firstof | 輸出第一個不爲False的參數 |
for | 循環對象 |
for … empty | 帶empty說明的循環 |
if | 條件判斷 |
ifequal | 若是等於 |
ifnotequal | 若是不等於 |
ifchanged | 若是有變化,則.. |
include | 導入子模版的內容 |
load | 加載標籤和過濾器 |
lorem | 生成無用的廢話 |
now | 當前時間 |
regroup | 根據對象重組集合 |
resetcycle | 重置循環 |
spaceless | 去除空白 |
templatetag | 轉義模版標籤符號 |
url | 獲取url字符串 |
verbatim | 禁用模版引擎 |
widthratio | 寬度比例 |
with | 上下文變量管理器 |
遍歷每個元素
{% for person in person_list %} <p>{{ person }}</p> {% end for%}
遍歷一個字典:
{% for k,v in dic.items %} <p>{{ k }}:{{ v }}</p>
下面是Django爲for標籤內置的一些屬性,能夠看成變量同樣使用{{ }}
在模版中使用。
for標籤帶有一個可選的{% empty %}
從句,在給出的組是空的或者沒有被找到時執行的操做
注:循環的對象是空,纔會走到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 %}
注:在if標籤中使用括號是錯誤的語法,這點不一樣於Pythonif語句支持 ,優先級可使用if嵌套。if支持and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判斷。
使用一個簡單地名字緩存一個複雜的變量,當你須要使用一個「昂貴的」方法(好比訪問數據庫)不少次的時候是很是有用的
{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
Django爲咱們提供了自定義的機制,能夠經過使用Python代碼,自定義標籤和過濾器來擴展模板引擎,而後使用{% load %}標籤。
在settings中的INSTALLED_APPS
配置當前app,否則django沒法找到自定義的simple_tag.
在app中新建一個templatetags
包(名字固定),與views.py、models.py等文件在同一目錄下
注:添加templatetags包後,須要從新啓動服務器,而後才能在模板中使用標籤或過濾器
建立任意 .py 文件,如:my_tags.py
要在模塊內自定義標籤,首先,這個模塊必須包含一個名爲register的變量,它是template.Library的一個實例,全部的標籤和過濾器都是在其中註冊的。 因此把以下的內容放在你的模塊的頂部:
from django.template import Library register = Library()
templatetags包中放多少個模塊沒有限制。只須要記住{% load xxx %}
將會載入給定模塊名中的標籤/過濾器,而不是app中全部的標籤和過濾器。
自定義過濾器就是一個帶有一個或兩個參數的python函數
注:函數的第一個參數是要過濾的對象,第二個是自定義參數,函數一共只能有兩個參數。
例子:
def filter_multi(v1,v2): return v1 * v2
定義好過濾器函數以後,須要註冊,方法是調用register.filter
register.filter('filter_multi',filter_multi)
Library.filter()
方法須要兩個參數:
還能夠把register.filter()
用做裝飾器,以以下的方式註冊過濾器:
@register.filter(name='yyy') 注:沒有聲明name參數,Django將使用函數名做爲過濾器的名字。
在要使用自定義過濾器的模板中導入建立的py文件。
語法:{% load 文件名 %}
要使用的地方。{{'abc'|yyy:'qwe'}}
結果輸出abcqwe
除了裝飾器,其它步驟與自定義過濾器類似。
@register.simple_tag()
過濾器只能有兩個參數,自定義標籤能夠傳多個值,空格傳值。
注:過濾器能夠用在if判斷中,標籤不能
模版繼承可讓您建立一個基本的「骨架」模版,它包含您站點中的所有元素,而且能夠定義可以被子模版覆蓋的 blocks 。
語法:{% include'模板名稱' %}
如:{% include 'base.html' %}
<!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="style.css"/> <title>{% block title %}My amazing site{% 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>
它定義了一個能夠用於兩列排版頁面的簡單HTML骨架。「子模版」的工做是用它們的內容填充空的blocks。
語法: {% block名字 %} 子模板的內容 {% endblock %}
{% block content %} <p>這是子的區域</p> <p>這是子的區域</p> <p>這是子的區域</p> <p>這是子的區域</p> {% endblock content%}
注:
{% extends %}
標籤,它必須是模板中的第一個標籤{% block %}
標籤越好,子模板沒必要定義所有父模板中的blocks{% endblock %}
設置一個名字{% block content %} {% endblock content%}
寫死靜態文件:
使用 static標籤函數:
{% load static %} <link rel="stylesheet" href="{% static 'css/mycss.css' %}">
使用get_static_prefix 標籤
{% load static %} <link rel="stylesheet" href="{% get_static_prefix %}css/mycss.css">