python的Web框架,Django模板變量,過濾器和靜態文件引入

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>
相關文章
相關標籤/搜索