########模板層######## 模板層其實就是templates文件夾里的html文件 其實這裡的每個html不是真正意義的上html代碼,只有經過模板渲染過後才算的上真正的html頁面。 一、模板語言(變數,深度查詢,過濾器,標簽) 1、變數 在django模板里通過{{ name }} ... ...
########模板層######## 模板層其實就是templates文件夾里的html文件 其實這裡的每個html不是真正意義的上html代碼,只有經過模板渲染過後才算的上真正的html頁面。 一、模板語言(變數,深度查詢,過濾器,標簽) 1、變數 在django模板里通過{{ name }} 表示一個變數,name就是一個變數名 首先我們要明白這個變數是怎麼傳出來的, 在視圖層: return render(request,'index.html',local()) #local()就把當前視圖函數的變數全部傳到index.html模板中,這樣就不要我們寫太多代碼了,但是 #也有缺點,就是把一些不需要渲染的變數也傳了過去。 模板層: 當程式讀到{{開頭,一直讀到}}結尾,這裡會有一個變數值,就會去名稱空間里找相應的變數。這其實 和我們之前寫socket寫服務端一樣的,讀取文件,再用相應的變數去替換掉符合條件的字元串。 好了好了,說說變數吧,記住一點就行:{{name}} ----> 相當於在python中執行了print(name)操作 你記住這個就行了!!!,這就是精髓。下麵我就寫寫偽代碼吧, name = 'zhuyu' #視圖層定義的變數 {{ name }} #在前臺頁面顯示 zhuyu 後面我就不寫註釋了 list = [1,2,3,['hello','word']] {{ list }} ---------> [1,2,3,['hello','word']] def run(): return 'run go' {{ run }} ---------> 'run go' #這裡我說下,在python中我們列印print(run),顯示的函數的記憶體地址, #會出現'run go',只能說明模板中執行函數,列印了它的返回值。 zhuyu = User('zhuyu',19) #這裡是User是一個類 {{ zhuyu }} --------> '<app01.views.index.<locals>.People object at 0x0000028D4DDDB240> ' #你在python中,列印一個對象,執行__str__,他的返回值就上面這個,所以說,看下麵 {{zhuyu.get_name}} -----> 'zhuyu ' #這是調用對象的方法,也是執行方法,列印的是它的返回值 總結:1、{{ 變數名 }} 其實就是執行print操作 2、假如該變數是一個函數,或者對象的函數屬性,就是幫你執行,列印執行後的返回值 3、不能列印帶參數的函數,方法,這裡要小心!!!! 2、過濾器 {{ 'name'|length }} 這是一個參數的過濾器 {{ 'zhu'|add:'yu' }} 這是兩個參數的過濾器 總結:|前是第一個參數,後面就是過濾器,冒號(:)就是第二個參數, 記住只能傳兩個參數,如果你想傳多個參數的話,你可以為第二個參數寫上指定的格式比如('a:b:c'),然後拿到該參數,也是就一個字元串,進行split(':')操作,這樣你就拿到一個列表了,相當於你第二個參數傳了三個參數,對不對。其實方法有很多的,看你自己怎麼寫了。 3、標簽 {% %} ------> 表示一個標簽,他是和變數、過濾器是有差距的,看也看得出來。 for迴圈: {%for foo in foos%} {% endfor %} if判斷: {% if %} {% endif %} with(相當於給一個複雜的變數名賦別名): {% with asdasdasdsa as as%} {% endwith %} 總結:1、這些不都不用多說了,學過python,這些再清楚不過了,記住它的語法規定就行了,for迴圈,if判斷,with都和python差不多。對了,for迴圈里有一個對 象,forlorp,是不在記不住你就在迴圈里列印看看是什麼就好了 2、哦哦,還有不是if判斷,它判斷的條件可以是過濾器,過濾器就是判斷它的返回值嘛,但不可以是標簽,沒有為什麼。 4、自定義過濾器,標簽 (1)、首先在app文件中新建一個文件夾(包),名字必須為templatetags (2)、在該文件夾中新建py文件,名字隨便你取:例如tags.py (3)、在py文件中導入模塊,並且實例化一個對象,名字必須為register from django.template import library register = library() (4)、繼續在該文件中寫的函數,過濾器,標簽其本質也是一個函數,但是你寫的函數必須要有裝飾器,這樣才能成為過濾器,標簽。 @register.filler(name='add') #這樣寫這個函數才是一個過濾器,對就是過濾器,name='add',給過濾器命名 def my_add(value1,value2): return value1+value2 @register.tag('add1') #這樣寫該函數才是標簽,就是在上面加裝飾器 def add_str(value1,value2,value3): return value1+value2+value3 (5)、上面的步驟,我們只是註冊了過濾器,標簽,想要使用的話,必須要在模板中導入 {% load tags %} #這裡的tags就是你新建的py文件 {{ 'zhuyu'|add:'nb' }} #這裡add就是我之前自定義的過濾器,不要在add 名字和已有的模板標簽重名說到重名,我現在有個想法,它到底是執行django自帶的過濾器,還是我定義的呢?這肯定是由先後的,自己去試試。 {% add1 'zhuyu' 'nb' '!'%} #這裡這個add1標簽必須傳多個參數,用空格去區別。 5、對了差點忘了深度查詢 對於列表,字典在python中我們是怎麼去取值的呢? name = ['zhuyu','zhanghao','daisongbai','wuyang','yangpeng'] info_dic = {'name':''zhuyu,'age':21} 取列表的第二個元素: name[1] 取字典key為name: info_dic[name] 但是在模板中,是沒有[]的,那麼我們該怎麼去取呢? 我們同一使用.,千萬別看漏了小數點,我們用.去取值 取列表的第三個元素: name.3 #這是在模板中記住 取字典的key為age: info_dic.age 深度查詢其實很簡單,你可以一直.下去。 今天就更新結束,哈哈,我只是通過講話的方式,來記錄一些知識點。