Django模板渲染——(二)
模板標(biāo)簽
模板是由HTML代碼和一些邏輯控制代碼組成的,邏輯控制代碼除了前面介紹的變量和過(guò)濾器,還要一個(gè)非常重要的模板標(biāo)簽。模板標(biāo)簽的語(yǔ)法規(guī)則是{%?tag %},模板標(biāo)簽在渲染的過(guò)程中能提供任意的邏輯關(guān)系,模板標(biāo)簽一般都有著與之對(duì)應(yīng)的結(jié)束標(biāo)簽,其標(biāo)簽名為在原來(lái)的標(biāo)簽名前加上end。下面介紹下一些常用的模板標(biāo)簽。
- {% if/elif/else %}
條件標(biāo)簽用于判斷,可以使用and,or,not,in等等來(lái)組織你的邏輯,但不允許and和or同時(shí)出現(xiàn)的條件語(yǔ)句中。
- {% ifequal %}、{% ifnotequal %}
比較是否相等,只限于簡(jiǎn)單的類型,比如字符串、整數(shù)、小數(shù)的比較,列表、字典、元組不支持。
- {% ifchanged %}
檢查一個(gè)值是否在上一次的迭代中改變,也可以配合else來(lái)寫(xiě)入未改變所執(zhí)行的語(yǔ)句。
- (% for in %}
跟python的for循環(huán)用法是一樣的,但不同的是模板中的for循環(huán)的迭代次數(shù)不能靠下標(biāo)來(lái)獲取,只能通過(guò)循環(huán)參數(shù)來(lái)獲取,下圖是一些常用的循環(huán)參數(shù)。
- {% for ... %} {% empty %}
for ... empty用于在for循環(huán)取到空值時(shí)再執(zhí)行empty內(nèi)的語(yǔ)句。
- {% load ... %}
load用于加載第三方標(biāo)簽,常用于靜態(tài)文件的引用中,如{% load static %}。
- {% url ‘name' %}
url標(biāo)簽是通過(guò)name來(lái)引入路由配置的地址,返回url的絕對(duì)路徑,還可在name空格后面添加參數(shù)。
- {% with 變量名?as? 別名 %}
用更簡(jiǎn)單的變量名緩存復(fù)制的變量名。
- {% autoescape off %}
這個(gè)標(biāo)簽用于關(guān)閉自動(dòng)轉(zhuǎn)義,類似于過(guò)濾器safe。
- {% comment %}?
comment用于多行注釋標(biāo)簽,要注意的是comment標(biāo)簽不能嵌套使用。{#? #}用于單行注釋
- {% block? ’content' %}
block標(biāo)簽可以被子模板覆蓋.查看,這里的content是名稱,在下面介紹模板繼承時(shí)會(huì)用到這里。
- {% extend 模板路徑 %}
extend用來(lái)指定當(dāng)前模板是繼承自哪個(gè)模板的。
- {% cycle 元素1 元素2 ...?%}
cycle標(biāo)簽常用在for循環(huán)中,每當(dāng)這個(gè)標(biāo)簽被訪問(wèn),則傳出一個(gè)它的可迭代參數(shù)的元素。第一次訪問(wèn)返回第一個(gè)元素,第二次訪問(wèn)返回第二個(gè)參數(shù),以此類推.一旦所有的變量都被訪問(wèn)過(guò)了,就會(huì)回到最開(kāi)始的地方,重復(fù)下去。
傳遞一個(gè)模板變量li = [1,2,3,4]給for循環(huán),迭代四次cycle標(biāo)簽,效果如下。
{% for i in li %} 這是第{{ i }}次迭代: {% cycle 'sky' 'run' 'water' %} <br>{% endfor %} 這是第1次迭代: sky 這是第2次迭代: run 這是第3次迭代: water 這是第4次迭代: sky元素不僅可以是自己寫(xiě)的字符串,還可以是模板變量。下面?zhèn)鬟f三個(gè)模板變量給cycle標(biāo)簽。
{% for i in li %}這是第{{ i }}次迭代: {% cycle tel sex li %} <br>{% endfor %} 這是第1次迭代: 12580 這是第2次迭代: girl 這是第3次迭代: [1, 2, 3, 4] 這是第4次迭代: 12580被包含在cycle中的變量將會(huì)被自動(dòng)轉(zhuǎn)義,從而使包含在變量中的標(biāo)簽對(duì)失效。若傳遞'b':'<b> hello world </b>','i':'<i>i am well </i>', 如下所示:
{% for j in li %}這是第{{ j }}次迭代: {% cycle b i %} <br>{% endfor %} 這是第1次迭代: <b> hello world </b> 這是第2次迭代: <i>i am well </i> 這是第3次迭代: <b> hello world </b> 這是第4次迭代: <i>i am well </i>我們可以通過(guò)autoescape標(biāo)簽來(lái)關(guān)閉自動(dòng)轉(zhuǎn)義,如下所示:
{% for j in li %}這是第{{ j }}次迭代:{% autoescape off %} {% cycle b i %} {% endautoescape %}<br>{% endfor %}我們也可以連續(xù)引用一個(gè)當(dāng)前循環(huán)的值,要達(dá)到這個(gè)目的,只需使用“as”來(lái)給{% cycle %}一個(gè)別名,當(dāng)要再次引用當(dāng)前循環(huán)值時(shí)只需輸入其別名即可。當(dāng)要進(jìn)入下一循環(huán)值可cycle一次別名即可。
如果你只是想要聲明cycle,但是不產(chǎn)生第一個(gè)值,你可以添加一個(gè)silent關(guān)鍵字來(lái)作為cycle標(biāo)簽的最后一個(gè)關(guān)鍵字。
{% cycle 'sky' 'run' 'water' as huge silent %} <br> {% for i in li %}這是第{{ i }}次迭代: <br>別名的變量是:{{ huge }} <br>{% cycle huge %} <br>{% endfor %} 這是第1次迭代: 別名的變量是:sky 這是第2次迭代: 別名的變量是:run 這是第3次迭代: 別名的變量是:water 這是第4次迭代: 別名的變量是:sky模板繼承和引用
往往一個(gè)網(wǎng)站的不同網(wǎng)頁(yè)都有著許多相同或相似的地方,模板的繼承可以讓你創(chuàng)建一個(gè)基本的骨架模板,然后使其他模板可以繼承它。一個(gè)模板要想能被其他模板所繼承,那么對(duì)于繼承的部分就要使用block標(biāo)簽來(lái)囊括。對(duì)于子模版來(lái)說(shuō),繼承其他模板的標(biāo)簽是extend,{% extend 模板路徑 %},該標(biāo)簽必須是模板中第一個(gè)出現(xiàn)的標(biāo)簽,類似于python導(dǎo)包,一般都是放在首行。
子模版對(duì)于父模板中的block標(biāo)簽內(nèi)的內(nèi)容,即可繼承,也可以自己修改。說(shuō)到底,子模板的繼承其實(shí)就是?替換掉?父模板中同名的block塊,其余沒(méi)有被替換掉的就被子模板原封不動(dòng)的繼承了下來(lái)。這里要注意的是,block中,前面的百分號(hào)的后面需要有空格,后面的百分號(hào)前面需要有空格。必須按格式來(lái),否則模板引擎會(huì)識(shí)別不了 。
在子模版中,在其對(duì)應(yīng)的block中,不僅可以修改從父模板繼承下來(lái)的內(nèi)容,也可以在修改后的基礎(chǔ)上,利用block.super變量再次提取父模板的這塊內(nèi)容。在子模版的block中,不僅可以自己修改內(nèi)容或提取父模板的內(nèi)容,還可以引用其他模板的內(nèi)容,引用的標(biāo)簽是include。
這里要注意的是,子模板中的所有內(nèi)容,必須出現(xiàn)在父模板定義好的block中,否則django將不會(huì)渲染。
下面是子模版的代碼
{% extends 'book/test.html' %}{% block content %} 這是子模版的主頁(yè) <br>這里再調(diào)用父模板的內(nèi)容:{{ block.super }} {% endblock %} {% block xxx %} {% include 'book/imp.html' %} {% endblock %}下面分別是父模板和被引用模板的代碼
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title> {% block title %}主頁(yè)面{% endblock %}</title><style>* {padding: 0;margin: 0;background-color:white;}div {width:200px;background-color: palegreen;}</style> </head> <body> {% block content %}<p>這是一個(gè)書(shū)店主頁(yè)</p> {% endblock %} <div>{% block text %} 這是所有頁(yè)面都有的部分 {% endblock %} </div> {% block xxx %} <i>這是演示部分</i>{% endblock %} </body> </html> <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>xxx</title><style>* {padding: 0;margin: 0;}</style> </head> <body> 這是被引用的部分</body> </html>子模版渲染效果如下:
靜態(tài)文件引用
靜態(tài)文件一般指的就是js文件、css文件、存放圖片的image等,首先我們可以在項(xiàng)目下創(chuàng)建一個(gè)static目錄,再在其下分別創(chuàng)建三個(gè)子目錄,分別是css、js、image。然后在settings文件下進(jìn)行配置,添加一個(gè)STATICFILES_DIRS 設(shè)置靜態(tài)文件目錄路徑,同templates。
引用靜態(tài)文件,選加載靜態(tài)文件的目錄static,使用load標(biāo)簽。然后對(duì)于js文件引用及css和圖片的引用于前端是一樣的,只是在輸入文件路徑時(shí)用static標(biāo)簽來(lái)引入。下面是一個(gè)小例子。
轉(zhuǎn)載于:https://www.cnblogs.com/longwhite/p/10397673.html
總結(jié)
以上是生活随笔為你收集整理的Django模板渲染——(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Magic5发布前夕 荣耀Magic4清
- 下一篇: Lodash常用用法总结