1. 程式人生 > >python的Web框架,Django模板變量,過濾器和靜態文件引入

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

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,
 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‘的列表目錄下尋找

 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模板變量,過濾器和靜態文件引入