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