[Python] Django框架入門4——深入模板

說明:

  本文主要深入瞭解模板(templates),主要涉及模板編寫步驟、定義模板、模板繼承、HTML轉義、CSRF等。

 

一、模板

  動態生成HTML、表達外觀、實現業務邏輯(view)與顯示內容(template)的分離。

  1、創建templates文件夾

    

    在根目錄創建templates文件夾

 

  2、模板處理

    step1 加載:根據給定的標識找到模板然後預處理,通常會將它編譯好放在內存中:

    

    step2 渲染:使用Context數據對模板插值並返回生成字符串:

          

      

     或者使用快捷方式(代替 step1和step2):

      

 

 

二、定義模板

  模板語言包括:

    變量:{{ varible }}

    標籤:{% 代碼塊 %}

    過濾器:

    註釋:{# 代碼或html #}

 

  1、在模板中調用對象的方法

    在models.py自定義類HeroInfo

    

 

    在views.py中傳遞HeroInfo對象

    

 

    在模板detail.html中調用

    

 

  2、標籤:{% tag %}

    for 標籤

      {% for each in list %}

        循環邏輯

        {{ forloop.counter }}表示當前是第幾次循環(開始下標爲1)

        {% empty %}

          給出的列表不存在,執行此處

      {% endfor %}

1 <!--【每頁的數據】-->
2     <ul>
3         {% for each in list  %}
4         <li>{{each.btitle}}</li>
5         {% endfor %}
6     </ul>

 

 

 

    

    if 標籤

      {% if ... %}

        邏輯1

      {% elif ... %}

        邏輯2

      {% else %}

        邏輯3

      {% endif %}

 

1   <!--【頁碼鏈接】-->
2     {% for pindex in plist %}
3         {% if pIndex == pindex %}
4             {{pindex}}&nbsp;&nbsp;
5         {% else %}
6             <a href="/booktest/page{{pindex}}/" >{{pindex}}</a>&nbsp;&nbsp;
7         {% endif %}
8     {% endfor %}

 

 

 

    

    comment 標籤

      {% comment %}

        多行註釋

      {% endcomment %}

    include:加載模板並以標籤內的參數渲染

      {% include "foo/bar.html" %}

    url:反向解析

      {% url: 'name' p1 p2 %}

    csrf_token:跨站請求僞造保護

      {% csrf_token %}

    布爾標籤:and\or, and比or優先級高

 

  3、過濾器

    語法:{{ 變量 | 過濾器 }}, 如{{ name | lower }} 表示變量name的值爲小寫輸出。

    例子:

      if list1 | length > 1  判斷列表的長度。

      name | lower | upper  過濾器能夠被 “串聯”,構成過濾器鏈接。

      list | join:", "      過濾器可傳遞參數,參數使用引號包起來。

      value | dafaule:"空白"  如果一個變量沒有被提供,或者值爲false或空,則使用默認值,否則使用變量的值

      value | date:"Y-m-d"  格式化輸出date變量

    

  

 

三、模板繼承

  模板繼承主要爲了減少頁面內容重複定義,實現頁面內容的重用。

  應用:網站的頭部、尾部都是一樣的,這些內容可以定義在父模板中,子模板不需要重複定義。

  block標籤:在父摸板中預留的區域,在子模板可以定義在父模板中,子模板不需要重複定義。

  extends:繼承、寫在模板文件的第一行。

  例子1:

    step1:定義父模板 base.html

   

    step2:定義子模板 index.html

    

 

    step3:在子模板中使用 block填充預留區域

    

 

 

四、HTML轉義

  Django對字符串進行自動HTML轉義。

  

 

   會被自動轉義的字符

    HTML轉義:就是包含html標籤輸出,而不被解釋執行,原因是當用戶提交字符串時,可能包含一些攻擊性的代碼,如js腳本。

    Django會將如下字符串自定轉義:

    

 

  當顯示不被信任的變量時使用escape過濾器,一般省略,因爲django自動轉義:{{ t1 | escape }}

  關閉轉義:

    對於變量使用safe過濾器:{{ data | safe }}

    對於代碼塊使用 autoescaoe標籤:

      {% autoescape off %}

        {{ body }}

      {% endautoescape %}

    標籤autoescape接受on或者off參數

    自動轉義標籤在base模板中關閉,在children模板中也是關閉的。

 

  字符串字面值

    手動轉義:{{ data | default:"<b>123</b>" }} 應寫爲:{{ data | default:"&lt;b&gt;123&lt;/b&gt" }}

  

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章