Python框架篇之Django(Template模版:標籤tag、自定義filter、extend模板繼承)

一、標籤的使用(tag)

1、語法格式:{% tags %}

2、提供的幾種標籤

  • {% if %}:計算一個變量值,如果是“true”,即它存在、不爲空並且不是false的boolean值,系統則會顯示{% if %}和{% endif %}間的所有內容
{% if ani.age > 25 %}
    <h1>{{ ani.name }},you have a lot of responsibilities!</h1>
{% elif ani.age >= 18 %}
    <h1>{{ ani.name }},you have been an adult!</h1>
{% else %}
    <h1>You just a child!</h1>
{% endif %}
  • {% for %}:允許你按順序遍歷一個序列中的各個元素,每次循環模板系統都會渲染{% for %}和{% endfor %}之間的所有內容
{#for循環#}
{#注意:for是沒有辦法拿到索引的,只能用forloop.counter來拿#}
{% for name in li %}
    <h3>{{ forloop.counter }}{{ name }}</h3>
    <h4>{{ forloop.revcounter }}{{ name }}</h4>
{% endfor %}

{% for name in li %}
    {% if forloop.first %}
{#        創建一個列表標籤,並且帶有class爲first的標籤背景色變紅#}
        <li class="first">
    {% else %}
        <li>
    {% endif %}
        {{ name }}
    </li>
    {% empty %}
        <h1>沒有相關文章!</h1>
{% endfor %}
  • {%csrf_token%}:用於生成csrf_token的標籤,用於防治跨站攻擊驗證。
  • {% url %}:引用路由配置的地址
{#{% url  %}引用路由配置地址#}
<form action="{% url 'login' %}" method="post">
    <p>賬號:<input type="text"></p>
    <p>密碼:<input type="text"></p>
    <p><input type="submit"></p>
    {% csrf_token %}
{#    一種Django的安全機制,相當於給頁面加上了一個身份證——一串編碼,有了這個纔可以正常跳轉到url 'login'頁面#}
</form>
  • {% with %}:用更簡單的變量名替代複雜的變量名
{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}
  • {% verbatim %}:禁止render
{% verbatim %}
         {{ hello }}
{% endverbatim %}
  • {% load %}: 加載標籤庫

二、自定義filter和simple_tag

1、自定義filter過濾器

  • a、首先在app中創建templatetags模塊
  • b、然後創建任意 .py 文件,如:myTag.py
  • c、套用引用代碼:
from django import template
from django.utils.safestring import mark_safe

register = template.Library()   #register的名字是固定的,不可改變
  • d、編寫自定義的函數
    11
  • e、在使用自定義simple_tag和filter的html文件中導入之前創建的 my_tags.py :{% load my_tags %}
  • f、在html中調用:由於filter函數只接收兩個參數,因此此處只能傳入一個參數,可以是列表、字典
<h1>filter:{{ ani.age|filter_muti:3 }}</h1>

2、自定義simple_tag:
可以傳任意個參數,用空格隔開
simple_tag_muti函數已經在上圖展示了,這裏直接調用

<h1>simple_tae:{% simple_tag_muti 26 2 10%}</h1>

3、注意:

  • a、在settings中的INSTALLED_APPS配置當前app,不然django無法找到自定義的simple_tag
  • b、filter可以用在if等控制語句後,simple_tag不可以
{% if num|filter_multi:30 > 100 %}
    {{ num|filter_multi:30 }}
{% endif %}

三、extend模板繼承

1、include 模板標籤
該標籤允許在(模板中)包含其它的模板的內容。 標籤的參數是所要包含的模板名稱,可以是一個變量,也可以是用單/雙引號硬編碼的字符串。 每當在多個模板中出現相同的代碼時,就應該考慮是否要使用 {% include %} 來減少重複。

2、extend繼承模板標籤
在整個網站中,如何減少共用頁面區域(比如站點導航)所引起的重複和冗餘代碼?
比如,如果有一個更典型的網站,它有導航條、樣式表,可能還有一些 JavaScript 代碼,事情必將以向每個模板填充各種冗餘的 HTML 而效率低下。
傳統解決方法是使用 服務器端的 includes ,你可以在 HTML 頁面中使用該指令將一個網頁嵌入到另一箇中。 事實上, Django 通過剛纔講述的 {% include %} 支持了這種方法。

3、extend 的本質
模板繼承就是先構造一個基礎框架模板,而後在其子模板中對它所包含站點公用部分和定義塊進行重載。

4、繼承的步驟
(1) 創建 base.html 模板,在其中定義站點的主要外觀感受。 這些都是不常修改甚至從不修改的部分。
(2) 爲網站的每個區域創建 base_SECTION.html 模板(例如, base_photos.html 和 base_forum.html )。這些模板對base.html 進行拓展,幷包含區域特定的風格與設計。
(3)爲每種類型的頁面創建獨立的模板,例如論壇頁面或者圖片庫。 這些模板拓展相應的區域模板。
這個方法可最大限度地重用代碼,並使得向公共區域(如區域級的導航)添加內容成爲一件輕鬆的工作

5、繼承後的修改

{#繼承base.html#}
{% extends 'base.html' %}

{#修改樣式:前提是base裏面也必須有{% block style %}#}
{% block styles %}
    <style>
        h2{
            background-color: yellowgreen;
        }
    </style>
{% endblock %}

{#但是有一部分需要修改,則只能改{{ block  }}裏的內容#}
{% block content %}
{#    獲取父類#}
    {{ block.super }}

    {% for s in student_list %}
        <h2>學生{{ s }}</h2>
    {% endfor %}
{% endblock %}

22

6、extend繼承注意

  • 如果在模板中使用 {% extends %} ,必須保證其爲模板中的第一個模板標記。 否則,模板繼承將不起作用。

  • 一般來說,基礎模板中的 {% block %} 標籤越多越好。 記住,子模板不必定義父模板中所有的代碼塊,因此你可以用合理的缺省值對一些代碼塊進行填充,然後只對子模板所需的代碼塊進行(重)定義。

  • 如果發覺自己在多個模板之間拷貝代碼,你應該考慮將該代碼段放置到父模板的某個 {% block %} 中。
    如果你需要訪問父模板中的塊的內容,使用 {{ block.super }}這個標籤吧,這一個魔法變量將會表現出父模板中的內容。 如果只想在上級代碼塊基礎上添加內容,而不是全部重載,該變量就顯得非常有用了。

  • 不允許在同一個模板中定義多個同名的 {% block %} 。 存在這樣的限制是因爲block 標籤的工作方式是雙向的。
    也就是說,block 標籤不僅挖了一個要填的坑,也定義了在父模板中這個坑所填充的內容。如果模板中出現了兩個相同名稱的 {% block %} 標籤,父模板將無從得知要使用哪個塊的內容。

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