python的Web框架,Django模板變量,過濾器和靜態文件引入
阿新 • • 發佈:2019-02-20
time_zone keyword ast 地址 func ssi 模板文件 config pat
HTML模板的路徑查找
在setting中設置查找路徑:
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‘, 45 #優先查找的路徑‘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‘的列表目錄下尋找
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 ]
只要找到了符合的模板就返回,不再向下繼續找了,所以優先級和路徑很重要
靜態頁面,動態頁面
靜態頁面是沒有改變,獲取到網頁後,是固定樣式的; 動態頁面是和服務器有交互的頁面,在與服務器交互後,返回的頁面會有不同的頁面返回給瀏覽器
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>
模板過濾器
傳遞的參數例子,為一下內容提供參數例子
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過濾器格式
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>
python的Web框架,Django模板變量,過濾器和靜態文件引入