1. 程式人生 > 其它 >今日學習內容總結5.2

今日學習內容總結5.2

今日學習內容總結

模板語法

模板語法之過濾器

過濾器說明

    1. 類似於Python的內建方法

    2. 將豎槓左側的資料當做第一個引數傳給右邊的過濾器

    3. 語法 : {{ [資料]|過濾器:可選引數 }}

    4. 注意 : 豎槓左右兩邊沒有空格

    5. 過濾器引數包含空格的話需要使用引號包裹

    6. 過濾器最多隻能有兩個引數

語法結構

    {{ 資料物件|過濾器名稱:引數 }}  過濾器最多隻能額外傳輸一個引數

常用過濾器使用

      django模板語法提供了60+過濾器,我們瞭解常用過濾器就可以了。

    <p>統計資料的長度:{{ s1|length }}</p>
    
    <p>算術加法或者字串加法:{{ n1|add:111 }}、{{ s1|add:'big baby' }}</p>
    
    <p>將數字轉成合適的檔案計量單位:{{ file_size|filesizeformat }}、{{ file_size1|filesizeformat }}</p>
    
    <p>判斷當前資料物件對應的布林值是否是False:{{ b|default:'前面的值對應的布林值是False' }}、{{ s1|default:'前面的值對應的布林值是False' }}</p>
    
    <p>時間格式化:{{ ctime|date:'Y-m-d' }}</p>
      
    <p>索引切片:{{ s1|slice:'0:8' }}</p>
    
    <p>按照空格擷取指定個數的文字:{{ s2|truncatewords:5 }}、{{ s1|truncatewords:1 }}</p>
    
    <p>按照字元個數擷取文字(包含三個點):{{ s2|truncatechars:5 }}、{{ s1|truncatechars:10 }}</p>
    
    <p>移除指定的字元:{{ info|cut:'|' }}</p>
    
    <p>是否取消轉換:{{ tag1 }}、{{ tag1|safe }}、{{ scripts1|safe }}、{{ res }}</p>

      最後一個|safe啟發了我們以後用django開發全棧專案前端頁面程式碼(主要指HTML程式碼)也可以在後端編寫:

    from django.utils.safestring import mark_safe
    html_safe = mark_safe('<h1>你好</h1>')

模板語法之標籤

      在django模板語法中寫標籤的時候,可以只寫關鍵字然後tab鍵就會自動補全。

語法結構

  {% 名字 ...%}

  {% end名字 %}

if判斷

  {% if 條件1 %}
    <p>你好啊</p>
  {% elif 條件2 %}
    <p>他好呀</p>
  {% else %}
    <p>大家好</p>
  {% endif %}

for迴圈

      提供了forloop關鍵字

    {% for i in l %}
        <p>{{ forloop }}</p>
        <p>{{ i }}</p>  # 迴圈從列表 l 中取出一個個元素
    {% endfor %}

    # forloop 輸出的是
    {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}

    counter0    索引
    counter     第一個元素
    revcounter  倒序第一個元素
    revcounter0 倒序索引
    first       是否是第一個元素
    last        是否是最後一個元素

for與if混合使用

    {% for i in l %}
        {% if forloop.first %}
            <p>is first</p>
        {% elif forloop.last %}
            <p>is last</p>
        {% else %}
            <p>{{ i }}</p>
        {% endif %}
    {% endfor %}

with : 取別名

    {% with ll.2.hobby.0 as hb %}
        <p>{{ hb }}</p>             # 可以使用別名取值
        <p>{{ ll.2.hobby.0 }}</p>   # 也可以使用原來的方式取值
    {% endwith %}

字典values、keys、items方法

    {% for k in d.keys %}
        <p>{{ k }}</p>
    {% endfor %}

    {% for v in d.values %}
        <p>{{ v }}</p>
    {% endfor %}

    {% for kv in d.items %}
        <p>{{ kv }}</p>
    {% endfor %}

自定義過濾器、標籤、inclusion_tag

建立 templatetags 檔案

    1. 首先在應用下建立一個名字必須叫"templatetags"資料夾
    
    2. 在改資料夾下建立一個任意名稱的 py 檔案 (例 : mytag)
    
    3. 在該 py 檔案內固定書寫兩行程式碼
          from django import template
          register = template.Library()

自定義過濾器

      自定義過濾器最多隻能有兩個形參。

    from .templatetags.mytag import register

    # 在模板層匯入自定義的過濾器時使用的是這裡指定的名字
    @register.filter(name='myfilter')  
    def sums(a, b):   # 函式名隨便起什麼
        return a + b  # 返回兩個引數的和
    {% load mytag %}  # 匯入tag檔案
    <p>{{ i|myfilter:100 }}</p>  # 使用myfilter過濾器

自定義標籤

      自定義標籤可以接收任意的引數。

    from .templatetags.mytag import register

    # 在模板層匯入自定義的標籤時使用的是這裡指定的名字
    @register.simple_tag(name="my_tag")
    def my_join(a,b,c,d):          # 函式名任意
        return f'{a}/{b}/{c}/{d}'  # 返回引數拼接後的結果

    {% load mytag %}  # 匯入tag檔案
    <p>{% my_tag 'hello' 'pai' 'da' 'xing' %}</p>  # 標籤之後的多個引數彼此之間用空格隔開

    # 自定義inclusion_tag
    from .templatetags.mytag import register

    @register.inclusion_tag('test.html',name='my_incl_tag')  # 第一個引數是需要渲染的HTML頁面
    def func(n):
        data=[]
        for i in range(n):
            data.append(f'第{i}頁')
        return locals()

    # test.html 檔案
    {% load mytag %}
    <p>{% my_incl_tag 6 %}</p>

    # test2.html
    {{ data }}
    {% for foo in data %}
        {% if forloop.first %}
            <p>{{foo}}</p>
        {% elif forloop.last %}
            <p>{{ foo }}</p>
        {% else %}
            <p>{{ foo }}</p>
        {% endif %}
    {% endfor %}

      該方法需要先作用於一個區域性html頁面,之後將渲染的結果放到呼叫的位置。內部原理:

    1. 在HTML頁面中匯入寫好的 inclusion_tag 並呼叫了

    2. 觸發了py檔案中一個函式的執行併產生結果
  
    3. 產生的結果通過模板語法傳遞給一個HTML頁面進行渲染

    4. 渲染完畢後又返回呼叫 inclusion_tag 的位置

      test.html 頁面中呼叫了 inclusion_tag----->觸發執行了一個函式產生結果並渲染到 test2.html 頁面中, 渲染完又返回 test.html 頁面。

模板

模板的匯入

      類似於將html頁面上的區域性頁面做成模組的形式 ,哪個地方想要直接匯入即可展示。

    {% include 'edit.html' %}  # 直接在當前HTML檔案裡面顯示 edit.html 檔案的內容

    <!---->  是HTML的註釋語法
    {##}		 是django模板語法的註釋
    
    HTML的註釋可以在前端瀏覽器頁面上直接檢視到
    模板語法的註釋只能在後端檢視 前端瀏覽器檢視不了

模板的繼承

模板繼承的使用

      模板的繼承首先需要選擇一個模板頁面, 在該頁面裡面使用 block 劃定可以被更改的區域:

    # 母板頁面 'home.html' 檔案
    {% block [區域名稱] %}
    ......
    {% endblock %}

      想要繼承的頁面可以使用 extends 來繼承某一個頁面。

    # 子版
    {% extends 'home.html' %}
    {% block [區域名稱] %}
    ......
    {% endblock %}

      子版繼承了模板, 那麼子版的整體格式與模板一樣, 被 block 劃分了的區域可以自己隨意更改。

      子頁面還可以重複使用父頁面的內容。

    {{ block.super }}

模板的三個區域

      模板上最少應該有三個區域:

    {% block css %}
        # css區域
    {% endblock %}

    {% block content %}
        # HTML區域
    {% endblock %}

    {% block js %}
        # js區域
    {% endblock %}

      目的是為了讓子版具有獨立的css、js等,增加擴充套件性。