HTML模板的路徑查找
在setting中設置查找路徑:css
1 #默認的查找在此處填寫,優先級最高,爲在manage.py的同級路徑中,添加(常規是template)文件夾,在(template)文件夾中配置HTML文件 2 3 默認路徑地址: 4 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
1 TEMPLATES = [ 2 { 3 'BACKEND': 'django.template.backends.django.DjangoTemplates', 4 5 #優先查找的路徑'DIR',對其進行拼接。 6 'DIRS':[os.path.join(BASE_DIR,'templates')] 7 8 #若是此處爲True,則會查找INSTALLED_APPS內註冊的目錄路徑下,會在app下的templas文件夾中尋找 9 'APP_DIRS':Ture 10 11 'OPTIONS': { 12 'context_processors': [ 13 'django.template.context_processors.debug', 14 'django.template.context_processors.request', 15 'django.contrib.auth.context_processors.auth', 16 'django.contrib.messages.context_processors.messages', 17 ], 18 }, 19 }, 20 ]
若是APP_DIRS爲True,則會在'DIRS'找完以後,在'INSALLSE_APPS'的列表目錄下尋找html
1 INSTALLED_APPS = [ 2 #註冊目錄 3 'teacher.apps.TeacherConfig' 4 'teacher':能夠如此簡寫 5 6 'django.contrib.admin', 7 'django.contrib.auth', 8 'django.contrib.contenttypes', 9 'django.contrib.sessions', 10 'django.contrib.messages', 11 'django.contrib.staticfiles', 12 ]
只要找到了符合的模板就返回,再也不向下繼續找了,因此優先級和路徑很重要python
靜態頁面,動態頁面
靜態頁面是沒有改變,獲取到網頁後,是固定樣式的; 動態頁面是和服務器有交互的頁面,在與服務器交互後,返回的頁面會有不一樣的頁面返回給瀏覽器django
context 模板變量
view中傳遞數據給html頁面,命名規則不能如下劃線開頭,其餘同python,變量的值能夠是任何數據類型跨域
context={'key':value} 例: #view文件內配置傳送: def index(request): now = datetime.now() return render(request, 'index.html',context={ 'nows':now #此處對應的字典傳送給index.html }) # index模板文件內配置接受: <body> <h2>當前時間爲:{{nows}}</h2> #此處的nows是對應的view文件中的key </body>
時間格式設置,設置的時間格式並非咱們想要的時區時間,就須要修改時間的參數。瀏覽器
setting中設置:
1 TIME_ZONE = 'Asia/Shanghai'
模板變量各類方法:安全
html接受的語法及輸出的結果:下列的列表、字典、函數等須要再views文件中配置才能夠接受服務器
1 <body> 2 列表:lt = [1,2,3] 3 <p>我是一個列表:{{lt}}</p> 4 輸出:[1,2,3] 5 <p>我是列表中的第二個值:{{lt.2}}</p> 6 輸出:2 7 8 9 函數: 10 <p>我是一個函數:{{func}}</p> 11 輸出:函數的結果 12 13 14 字典:dt = {'name':'hong','age':18,'items':'abc'} 15 <p>我是一個字典:{{dt}}</p> 16 輸出:{'name':'張三','age':18} 17 <p>我是字典的一個值:{{dt.name}}</p> 18 輸出:張三 19 20 21 22 其餘異議的字典輸出: 23 <p>調用字典的一個方法{{dt.items}}</p> 24 輸出:abc; 若是字典中沒有'items'這個鍵,則返回的是items的這個字典方法 25 1.首先鍵值對查找;而後屬性或方法調用 26 27 28 29 總結: 30 1、計算變量,將其替換爲結果 31 2、遇到(.)的時候,按照如下順序查找: 32 -1.字典的鍵值對 33 -2.屬性或者方法查找 34 -3.數字索引查找 35 3、若是結果是可調用的,則調用它時不帶參數,調用的結果爲模板的值 36 37 **渲染失敗返回空** 38 </body>
模板過濾器
傳遞的參數例子,爲一下內容提供參數例子session
1 now = datetime.now() 2 3 lt = [1,2,3] 4 5 dt = {'name':'張三','age':18,'items':'aBc','text':'i an hua'} 6 7 def func() 8 return '我是一個函數'
日期,時間的格式化date,time
以上列代碼傳送的參數 時間now爲例:
1 <body> 2 <p>當前日期時間{{now|date:"Y年m月d日 H時i分s秒"}}</p> 3 <p>當前時間{{now|time:"H時i分s秒"}}</p> 4 </body>
輸出格式的結果爲:
1 當前日期時間2019年02月20日 11時53分11秒 2 當前時間11時53分11秒
date和time過濾器格式app
Y:四位數的年。如:1999 y:兩位數的年。如:99 m:兩位數的月。如:01, 09 n:一位數的月。如:1, 9, 12 d:兩位數的日。如:01, 09, 31 j:一位數的日。如:1, 9, 12 g:12小時制的一位數小時。如:1, 9 ,12 G:24小時制的一位數小時。如:0, 8 ,23 h:12小時制的兩位數小時。如:01, 09, 12 H:24小時制的兩位數小時。如:01, 13, 24 i:分鐘。從00-59 s:秒。從00-59
add:將參數與值相加,首先嚐試轉換成整數相加,若是失敗,則嘗試其餘多有可能,{{value|add:'value'}}
1 <p>1列表值的相加:{{ lt.1|add:'3' }}</p> 2 3 <p>2列表值的相加:{{ lt.1|add:'3.5' }}</p> 4 <p>2列表值的相加:{{ lt.1|add:3.5 }}</p> 5 6 <p>函數的值爲{{ func|add:'haha' }}</p>
輸出結果
1 1列表值的相加:5 2 3 2列表值的相加: 4 2列表值的相加:5 5 #add後面的值若是是str類型不是整數則渲染失敗,返回爲空,若是是int類型則會轉成整數再相加 6 7 3函數的值爲:我是一個函數haha
capfirst:首字母大寫
1 <p>首字母的大小寫方法:{{ dt.items|capfirst }}</p>
輸出結果
1 首字母的大小寫方法:ABc
default:若是變量解析失敗,則返回給定的默認值,當value是''空字符串,也會輸出默認值。
1 例子 2 def func(aa): 3 return '帶參數的函數' 4 def func(): 5 return ''' 6 def func(aa): 7 return None 8 9 10 <p>解析失敗則返回默認值:{{ func|default:"nothing" }}</p>
輸出結果
1 解析失敗則返回默認值:nothing
first,last:第一個元素和最後一個元素
1 <p>列表的第一個元素:{{ lt|first }}</p> 2 <p>列表的最後一個元素:{{lt|last}}</p>
輸出結果
1 列表的第一個元素:1 2 列表的最後一個元素:3
slice:切片
1 <p>我是列表的倒序:{{ lt|slice:"::-1"}}</p>
輸出結果:
1 我是列表的倒序:[3,2,1]
join:鏈接字符串列表,與str.join(list)同樣
1 <p>把字典的value鏈接起來:{{ dt.name|join:"xxx"}}</p>
輸出結果
1 把字典的value鏈接起來:張xxx三
floatformat:浮點數格式化,不指定小數位參數,默認保留一位
value Template Output(結果) 34.23234 {{ value|floatformat}} 34.2
34.23234 {{ value|floatformat:3}} 34.232
length,length_is:返回字符串或列表的長度
1 <p>列表的長度是:{{ lt|length}}</p> 2 <p>列表的長度是{{ le|length }}?:{{ lt|length_is:3 }}</p>
輸出結果
1 列表的長度是:3 2 列表的長度是3嗎?:True
lower, upper :字符串中的字符都變小寫和大寫
1 <p>字符都變小寫:{{ dt.items|lower }}</p> 2 <p>字符都變大寫:{{ dt.items|upper }}</p>
輸出結果
1 字符都變小寫:abc 2 字符都變大寫:ABC
title:標題化,首字母大寫
1 <p>title標題化:{{ dt.text|title }}</p>
輸出結果:
1 title標題化:I Am Hua
過濾器能夠用鏈式的方式:
只要可以解析出來,就能夠接多個的過濾器
{{func|default:"nothing"|add:"haha"}}
safe:關閉變量的自動轉義,使html標籤生效,xss跨域腳本攻擊
反射型和存儲型,由於瀏覽器會解析css和js,因此django幫咱們管理這方面的問題。
js = '<script>alert("1")</script>' html = '<h3>我是安全的,須要渲染成html</h3>' <p>{{ html|safe }}</p> 添加了safe後,纔會執行這段代碼,而不是轉義成文本格式。
我是安全的,須要渲染成html
靜態文件
settings文件中設置靜態文件路徑的配置
默認是static,但也能夠更改成其餘
1 STATIC_URL = '/static/'
同時在manage文件的當前目錄下,建立static文件夾,在其文件下建立app的文件夾,用於管理靜態文件(css,js,img等……)
1 STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
靜態文件的引入
-硬編碼
在css文件夾下建立了同名的css文件。而後在html中的head內引入文件
html代碼
1 <head> 2 <link rel="stylesheet" href="/abab(和setting中的STATIC_URL對應)/teacher/css/index.css"> 3 </head>
-模板標籤,動態解析
在html的首行(第一行代碼) html代碼
1 {% load static %} 2 3 <head> 4 <link rel="stylesheet" href="{% static 'teacher/css/index.css' %}"> 5 </head>