02.Django-模板

模板

1. 簡介

  • 模板由HTML程式碼和邏輯控制程式碼構成
  • 同一個模板,可以有多個上下文,就可以通過穿件模板對象來渲染多個上下文
  • 創建一個模板就可以多次調用render()方法來渲染上下文
  • Django模板解析工作都是在後台通過對正則表達式一次性調用來完成

2. 語法

2.1 模板繼承

include(繼承) 模板標籤

  • {% include %} 是一個內建模板標籤,允許在模板中包含其他的模板內容
  • 標籤的參數是所要包含的模板的名稱,可以是一個變數,也可以是單/爽引號硬編碼的字元串
  • 在多個模板中出現相同的程式碼時,應該考慮使用{% include %}來減少程式碼重複

extend(繼承) 模板標籤

1. 定義母版	{% block title %}......{% endblock %}
2. 定義子板	
	{% extends "base.html" %}		<!--繼承母版的內容,且必須放在模板第一行-->
	{% block title %}{% endblock %}	<!--所繼承的盒子的內容-->
	{% csrf_token %}				<!--取消csrf安全保護-->
	{{ block.super }}				<!--繼承父模板中的內容-->
	{% include "小組件路徑" %}		<!--HTML出現相同的程式碼時,新建公用小組件HTML文件-->
  • 模板繼承是先構造一個基礎模板,而後在子模板中對部分塊進行重載
  • 在模板中使用{% extends %},須保證其為模板中的第一個標記,否則模板不起作用
  • 一個模板中不能定義多個同名的{% block %}
  • block標籤的工作方式是雙向的,block標籤定義了在父模板中{% block %}
  • 父模板中不能出現兩個相同名稱的{% block %}標籤
  • 需要訪問父模板中的塊的內容,使用{{ block.super }}標籤繼承父模板中的內容

2.2 模板語言的控制語句

  • for 標籤:

    循環遍歷可迭代變數中的每一個元素,沒有break和continue等複雜功能,相關操作類比python。

    <!--遍歷列表-->
    {% for name in name_list %}
    	<li>{{ name }}</li>
    {% endfor %}
    <!--反向遍歷-->
    {% for name in name_list reversed %}
    	<li>{{ name }}</**li**>
    {% endfor %} 
    <!--列表中字典取值-->
    {% for info_dic in name_list %}
    	<li>{{ info_dic.name }}</li>
    {% endfor %}
    <!--遍歷字典-->
    {% for k,v in info_dict.items %} 
    	<li>{{ k }}:{{ v }}</li> 
    {% endfor %}
    
  • for…empty…:

    for遍歷一個空的變數或者未找到時執行empty

    {% for info_dic in name_list %} 
    	<li>{{ info_dic.name }}</li> 
    {% empty %} 
    	<p>給出的變數為空或者未找到!</p> 
    {% endfor %}  
    
  • if 標籤:

    ​ 判斷變數的邏輯值是進行選擇性的輸出,前後必須要有空格

    ​ 類比python < = > <= >= != == and or not not in is is not

    {% if num > 100 %}
    	<h1>大於100</h1>
    {% elif num < 100 %}
    	<h1>小於100</h1>
    {% else %}
    	<h1>等於100</h1>
    {% endif %}
    
  • with 標籤:

    ​ 多用於給一個複雜的變數起別名

    ​ 注意:等號左右不要加空格。

    {% with total=business.employees.count %}
    	{{ total }} <!--只能在with語句體內用-->
    {% endwith %}
    <!--或-->
    {% with business.employees.count as total %}
    	{{ total }}
    {% endwith %}
    
  1. url語句

    url標籤中使用模板變數和普通標籤參數一樣,空格隔開,{{ % url 別名 %}}即可。

    {% url 'index' %} <!--映射到name為index的請求路徑-->
    
  2. load語句

    載入靜態資源

    <!--靜態資源路徑-->
    {% static %} 
    {% load static %}
    <img src="{% static "images/hi.jpg" %}" alt="Hi!" />
    <!--引用JS文件時使用:-->
    {% load static %}
    <script src="{% static "mytest.js" %}"></script>
    <!--某個文件多處被用到可以存為一個變數-->
    {% load static %}
    {% static "images/hi.jpg" as myphoto %}
    <img src="{{ myphoto }}"></img>
    
    <!--動態獲取靜態資源路徑-->
    {% get_static_prefix %}
    {% load static %}
    <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
    <!--或者-->
    {% load static %}
    {% get_static_prefix as STATIC_PREFIX %}
    <img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
    <img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
    
  3. csrfr_token標籤

    {% csrf_token %}
    

    用於生成csrf_token的標籤,用於防治跨站攻擊驗證

    如果view的index里用的是render_to_response方法,則不會生效

    其實質是生成一個input標籤,然後與其他標籤一起提交給後台

  4. verbatin語句

    阻止模板語言的渲染

    <!--禁止render,原樣渲染-->
    {% verbatim %}
             {{ hello }}
    {% endverbatim %}
    
  5. 自定義filter和simply_tag

    自定義filter

    1. 首先在某個app中,創建一個python包,叫做templatetags,注意,這個包的名字必須為templatetags,不然就找不到。

    2. 在這個templatetags包下面,創建一個python文件用來存儲過濾器。

    3. 在新建的python文件中,定義過濾器(也就是函數),這個函數的第一個參數永遠是被過濾的那個值,並且如果在使用過濾器的時候傳遞參數,那麼還可以定義另外一個參數。但是過濾器最多只能有2個參數。

    4. 在寫完過濾器(函數)後,要使用django.template.Library.filter進行註冊。

      from Django import template
      register= template.Library()
      defgreet(value,word):
      	return value + word
      register.filter(「greet「(註冊名稱),greet)
      
    5. 還要把這個過濾器所在的這個app添加到settings.INSTALLED_AAPS中(如果創建應用時已經添加過,就省略這一步)

    6. 在模板中使用load標籤載入過濾器所在的python包。

    7. {% load [自定義過濾器的文件名] %}

    自定義simply_tag

    1. 在APP下面創建一個包。比如:template_tag並在包內創建比如:xx.py文件。

      from django import template
      register = template.Library()
      
      @register.simple_tag
      def my_simple_time(v1):
          return v1*1000
      
    2. 在setting中修改。INSTALLAPP加上創建的包名。

    3. 在html里加一句{%load template_tag%}在合適的位置使用標籤{{ my_simple_time 參數 }}

2.3 變數的過濾器(filter)的使用

格式

{{ obj | filter : param}}

參數

  • add過濾器:
    • value與參數相加,若不能轉換成int,則返回空
  • cut過濾器:
    • 移除value中所有指定的字元串。類似於python中的replace()
  • date過濾器:
    • date將一個日期按照指定的格式,格式化成字元串。
    • Y:四位數字年份;m:兩位數字月份;n:月份;d:兩位數字的天;j:天;g:12小時制的小時;G:24小時制的小時;h:12小時制兩位數的小時;H:24小時制兩位數的小時;i:分鐘;s:秒
  • default過濾器:
    • 如果value為False([],””,None,{},()),則返回參數
  • default_if_none過濾器:
    • 如果value為None,則返回參數
  • first和last過濾器:
    • first返回列表/元組/字元串中的第一個元素。
    • last返回列表/元組/字元串中的最後一個元素。
  • floatformat過濾器:
    • floatformat使用四捨五入的方式返回一個浮點類型;參數為X,則保留X位小數。
  • join過濾器:
    • 類似與Python中的join,將列表/元組/字元串用指定的字元進行拼接。
  • length過濾器:
    • 獲取一個列表/元組/字元串/字典的長度。
  • lower和upper過濾器:
    • lower將value中所有的字元全部轉換成小寫。
    • upper將value中所有的字元全部轉換成大寫。
  • random過濾器:
    • 從value中隨機選擇一個值。
  • safe過濾器:
    • 關閉字元串的自動轉義,如果value是一串html程式碼,那麼將會把這個html程式碼渲染到瀏覽器中。
  • slice過濾器:
    • 類似於python中的切片。
  • striptags過濾器:
    • 刪除字元串中所有的html標籤。
  • truncatechars過濾器:
    • 參數限制了value的長度,最後一個參數以…作為省略號。
  • truncatechars_html過濾器
    • 與truncatechars類似,但不會去掉html標籤