django-模板之標籤

目錄

    模板

    模版是純文本文件,能夠生成任何基於文本的文件格式,好比HTML,XML,CSV等。Django模版語言致力於在性能和簡單性上取得平衡。Django的模版系統並非簡單的將Python嵌入到HTML中。css

    下面是一個小模版,它展現了一些基本的元素。html

    {% extends "base_generic.html" %}

    {% block title %}{{ section.title }}{% endblock %}

    {% block content %}
    <h1>{{ section.title }}</h1>

    {% for story in story_list %}
    <h2>
      <a href="{{ story.get_absolute_url }}">
        {{ story.headline|upper }}
      </a>
    </h2>
    <p>{{ story.tease|truncatewords:"100" }}</p>
    {% endfor %}
    {% endblock %}

    注意:
        調用對象裏面的方法的時候,不須要寫括號來執行,而且只能執行不須要傳參數的方法,若是你的這個方法須要傳參數,那麼模板語言不支持,不能幫你渲染

    每個Web框架都須要一種很便利的方法用於動態生成HTML頁面。 最多見的作法是使用模板。模板包含所需HTML頁面的靜態部分,以及一些特殊的模版語法,用於將動態內容插入靜態部分。python

    Django能夠配置一個或多個模板引擎(語言),也能夠不用引擎。Django自帶一個稱爲DTL(Django Template Language )的模板語言,以及另一種流行的Jinja2語言(須要安裝,pip install Jinja2)。web

    Django爲加載和渲染模板定義了一套標準的API,與具體的後臺無關。加載指的是,根據給定的模版名稱找到的模板而後預處理,一般會將它編譯好放在內存中。渲染則表示,使用Context數據對模板插值並返回生成的字符串。數據庫

    語法
    變量相關的用{{}},邏輯相關的用{%%}。

    模板渲染的官方文檔:(https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#std:templatetag-for)

    本文參考官方文檔,即用的是DTL引擎。

    Django模板語言的語法包括四種結構:變量、標籤、過濾器、註釋。django

    變量

    變量的值來自context中的數據字典, 相似於字典對象的keys到values的映射關係。後端

    在Django的模板語言中按此語法使用:{{ 變量名 }}。當模版引擎遇到一個變量,它將從上下文context中獲取這個變量的值,而後用值替換掉它自己。 變量的命名包括任何字母數字以及下劃線的組合。變量名稱中不能有空格或標點符號。緩存

    深度查詢據點符(.)在模板語言中有特殊的含義。當模版系統遇到點("."),它將以這樣的順序查詢:安全

    1. 字典查詢(Dictionary lookup),字典鍵查找優先於方法查找
    2. 屬性或方法查詢(Attribute or method lookup)
    3. 數字索引查詢(Numeric index lookup)

    注意事項:app

    1. 若是計算結果的值是可調用的,它將被無參數的調用。 調用的結果將成爲模版的值。
    2. 若是使用的變量不存在, 模版系統將插入 string_if_invalid 選項的值, 它被默認設置爲'' (空字符串) 。
    3. {{ foo.bar }}這種模版表達式中的「bar」,若是在模版上下文中存在,將解釋爲一個字面意義的字符串而不是使用變量bar的值 。

    標籤

    模版語言中的標籤相似Python中的函數,能夠輸出內容、控制結構,甚至能夠訪問其餘的模板標籤。

    {% csrf_token %} # csrf令牌標籤,用於POST提交。

    部分標籤須要使用起始和閉合標籤。 

    for循環標籤

    循環對象中每一個元素。須要結束標籤{% endfor %}

    顯示athlete_list中提供的運動員列表:
    <ul>
    {% for athlete in athlete_list %}
        <li>{{ athlete.name }}</li>
    {% endfor %}
    </ul>

    循環對象points的每一個元素都是(x,y)這樣的二元元組,並返回:
    {% for x, y in points %}
        There is a point at {{ x }},{{ y }}
    {% endfor %}

    訪問一個字典中的鍵值:
    {% for key, value in data.items %}
        {{ key }}: {{ value }}
    {% endfor %}

    可使用{% for obj in list reversed %}進行反向循環。

    下面是Django爲for標籤內置的一些屬性,能夠看成變量同樣使用{{ }}在模版中使用。

    forloop.counter:循環的當前索引值,從1開始計數;經常使用於生成一個表格或者列表的序號

    forloop.counter0:循環的當前索引值,從0開始計數;

    forloop.revcounter: 當前循環的倒序索引值(最後一個爲1

    forloop.revcounter0  當前循環的倒序索引值(最後一個爲0

    forloop.first:判斷當前是否循環的第一次,是的話,該變量的值爲True

    forloop.last:若是這是最後一次循環,則爲真

    forloop.parentloop:對於嵌套循環,返回父循環所在的循環次數。

    for … empty

    for標籤帶有一個可選的{% empty %}從句,以便在循環對象是空的或者沒有被找到時,能夠有所操做和提示。

    <ul>
    {% for athlete in athlete_list %}
        <li>{{ athlete.name }}</li>
    {% empty %}      # 若列表爲空,則執行。
        <li>Sorry, no athletes in this list.</li>
    {% endfor %}
    </ul>

    if-elif-else標籤

    須要{% endif %}結束標籤。

    {% if athlete_list %}
        Number of athletes: {{ athlete_list|length }}
    {% elif athlete_in_locker_room_list %}
        Athletes should be out of the locker room soon!
    {% else %}
        No athletes.
    {% endif %}

    還能夠在if標籤支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判斷等多種運算符,注意條件兩邊都有空格。也可以使用過濾器。

    {% if somevar == "x" %}
      This appears if variable somevar equals the string "x"
    {% endif %}

    {% if athlete_list|length > 1 %}
       Team: {% for athlete in athlete_list %} ... {% endfor %}
    {% else %}
       Athlete: {{ athlete_list.0.name }}
    {% endif %}

    # 注意,大多數模版過濾器都返回字符串類型,因此使用過濾器作整數類型的比較一般是錯誤的,但length是一個例外。

    操做符均可以組合以造成複雜表達式。操做符的優先級從低至高以下:

    or
    and
    not
    in
    ==,!=,<,>,<= ,>=
    與Python的規則是同樣的。

    若是想要不一樣的優先級,那麼須要使用嵌套的if標籤,而不能使用圓括號。比較運算符不能像Python或數學符號中那樣「連接」。

    {% if a > b > c %}  (錯誤的用法)
    {% if a > b and b > c %} (正確的用法)

    {% if athlete_list and coach_list %}
        Both athletes and coaches are available.
    {% endif %}

    {% if not athlete_list %}
        There are no athletes.
    {% endif %}

    {% if athlete_list or coach_list %}
        There are some athletes or some coaches.
    {% endif %}

    {% if not athlete_list or coach_list %}
        There are no athletes or there are some coaches.
    {% endif %}

    {% if athlete_list and not coach_list %}
        There are some athletes and absolutely no coaches.
    {% endif %}

    with

    使用一個簡單地名字緩存一個複雜的變量,多用於給一個複雜的變量起別名。當須要使用一個代價較大的方法(好比訪問數據庫)不少次的時候這是很是有用的。

    像這樣:

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

    能夠分配多個變量:

    {% with alpha=1 beta=2 %}
        ...
    {% endwith %}

    注意等號左右不要加空格

    csrf_token

    若不使用此標籤以post方式提交表單時,會報錯。若是在settings裏面的中間件配置裏把csrf的防護機制給註銷,則不會報錯,但不安全。這個標籤用於跨站請求僞造保護

    在頁面的form表單裏面任何位置寫上{% csrf_token %},在模板渲染的時將被替換成相似於下方的input標籤:
    <input type="hidden" name="csrfmiddlewaretoken" value="8J4z1wiUEXt0gJSN59dLMnktrXFW0hv7m4d40Mtl37D7vJZfrxLir9L3jSTDjtG8">

    這個標籤的值是個隨機字符串,提交的時候,值也被提交了,首先這個標籤是後端渲染給頁面加上的,那麼當經過form表單提交數據時候,後臺django有相同的一個值,能夠作對應驗證是否是我給你的token,若是用戶沒有按照這個正常的頁面來post提交表單數據,那麼就能知道這個請求是非法的,反爬蟲或者惡意攻擊網站

    comment

    註釋

    註釋能夠包含任何模版內的代碼,有效的或者無效的均可以。當要註釋掉一些代碼時,能夠用此來記錄代碼被註釋掉的緣由。單行註釋語法:{# #}

    {# this won't be rendered #} # 單行註釋

    {% comment %}標籤提供多行註釋功能。

    {% comment %}{% endcomment %}之間的內容會被忽略,做爲註釋。例如:

    <p>Rendered text with {{ pub_date|date:"c" }}</p>
    {% comment "Optional note" %}
        <p>Commented out text with {{ create_date|date:"c" }}</p>
    {% endcomment %}

    comment標籤不能嵌套使用。

    block和extends標籤

    繼承和複寫模版。相似Python的類繼承和重寫機制。

    extends標籤表示當前模板繼承自一個父模板。

    這個標籤能夠有兩種用法:

    • {% extends "base.html" %}:繼承名爲"base.html"的父模板
    • {% extends variable %}:使用variable變量表示的模版
    模板繼承

    Django模版引擎中最強大也是最複雜的部分就是模版繼承了。模版繼承容許你建立一個包含基本「骨架」的父親模版,它包含站點中的共有元素,而且能夠定義可以被子模版覆蓋的blocks。經過下面這個例子,理解模版繼承的概念:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <link rel="stylesheet" href="style.css" />
        <title>{% block title %}My amazing site{% endblock %}
        </title>#注意此處,block標籤。
    </head>

    <body>
        <div id="sidebar">
            {% block sidebar %}   #注意此處
            <ul>
                <li><a href="/">Home</a></li>
                <li><a href="/blog/">Blog</a></li>
            </ul>
            {% endblock %}         #結束標籤
        </div>

        <div id="content">
            {% block content %}
            {% endblock %}      #注意此處
        </div>
    </body>
    </html>

    這個模版,一般被命名爲base.html,它定義了一個能夠用於兩列排版頁面的簡單HTML骨架。

    「子模版」須要作的是先繼承父模板base.html,而後複寫、填充,或者說實現其中的blocks

    block是在子模版中可能會被覆蓋掉的位置。在上面的例子中,block標籤訂義了三個能夠被子模版內容填充的block,分別是title、content和siderbar。

    子模版可能看起來是這樣的:

    {% extends "base.html" %}        #extends標籤是這裏的關鍵。它告訴模版引擎,這個模版「繼承」了另外一個模版。當模版系統處理這個模版時,首先會去加載父模版,也就是「base.html」。

    {% block title %}My blog{% endblock %}   #修改base裏title標籤裏的內容。

    {% block content %}
    {% for entry in blog_entries %}
        <h2>{{ entry.title }}</h2>
        <p>{{ entry.body }}</p>
    {% endfor %}
    {% endblock %}

    # 加載過程當中,模版引擎將注意到base.html中的三個block標籤,並用子模版中的內容來替換這些block。

    請注意,上面例子中的子模版並無定義sidebar block,這種狀況下,將使用父模版中的內容。父模版的{% block %}標籤中的內容老是被用做默認內容。

    Django多級繼承經常使用方式相似下面的三級結構:

    • 建立一個base.html模版,用來控制整個站點的主要視覺和體驗。
    • 爲站點的每個app,建立一個base_SECTIONNAME.html模版。 例如base_news.html,base_sports.html。這些模版都繼承base.html,而且包含了各自特有的樣式和設計。
    • 爲每個頁面類型,建立獨立的模版,例如新聞內容或者博客文章。 這些模版繼承對應app的模版。

    上面的方式可使代碼獲得最大程度的複用,而且使得添加內容到共享的內容區域更加簡單,例如app範圍內的導航條。

    使用繼承的一些相關說明:

    • 若是在模版中使用{% extends %}標籤,它必須是模版中的第一個標籤,必須放在文件首行

    • 在base模版中設置越多的{% block %}標籤越好。子模版沒必要定義所有父模版中的blocks,因此能夠在大多數blocks中填充合理的默認內容,而後,只定義你須要的那一個。多一點鉤子總比少一點好。

    • 若是發現本身在複製大量重複的模版內容,那意味着應該把重複的內容移動到父模版中的一個{% block %}中。

    • 若是須要獲取父模板中的block的內容,想要在父block中新增內容而不是徹底覆蓋它,可使用{{ block.super }}變量。使用{{ block.super }} 插入的數據不會被自動轉義,由於父模板中的內容已經被轉義。

    • {% block %}以外建立的變量使用模板標籤的as語法,不能在塊內使用。

      例如,下面的模板不會顯示任何內容:

    {% trans "Title" as title %}
    {% block content %}{{ title }}{% endblock %}
    • 爲了更好的可讀性,能夠給{% endblock %}標籤一個取名字,如:{% block content %} 。在大型模版中,這有助於你清楚的看到哪個{% block %}標籤被關閉了。

    • 不能在一個模版中定義多個相同名字的block標籤。

    Django1.10中添加了使用相對路徑的能力。一般模板名稱是相對於模板加載器的根目錄。字符串參數也能夠是以./../開頭的相對路徑。 例如,假設有如下目錄結構:

    dir1/
        template.html
        base2.html
        my/
            base3.html
    base1.html

    在template.html中,如下路徑將有效:

    {% extends "./base2.html" %}
    {% extends "../base1.html" %}
    {% extends "./my/base3.html" %}

    url

    於url的反向解析。返回與給定視圖和可選參數匹配的絕對路徑引用(不帶域名的URL)。在解析後返回的結果路徑字符串中,每一個特殊字符將使用iri_to_uri()編碼。這能夠避免在模板中硬編碼超級連接路徑。

    {% url 'some-url-name' v1 v2 %}

    第一個參數是url()的名字。 它能夠是一個被引號引發來的字符串或者其餘的上下文變量。其餘參數是可選的而且以空格隔開,這些值會在URL中以參數的形式傳遞。上面的例子展現瞭如何傳遞位置參數,也可使用關鍵字參數。

    {% url 'some-url-name' arg1=v1 arg2=v2 %}

    不要把位置參數和關鍵字參數混在一塊兒使用。URLconf所需的全部參數都應該提供。

    例如,假設有一個視圖app_views.client,其URLconf接受客戶端ID,並以下所示:

    ('^client/([0-9]+)/$', app_views.client, name='app-views-client')

    若是你的應用中的URLconf已經被包含到項目URLconf中,好比下面這樣

    ('^clients/', include('project_name.app_name.urls'))

    而後,在模板中,你能夠建立一個此視圖的連接,以下所示:

    {% url 'app-views-client' client.id %}

    模板標籤會輸出字符串:/clients/client/123/

    若是但願在不顯示網址的狀況下檢索網址,可使用略有不一樣的調用:

    {% url 'some-url-name' arg arg2 as the_url %}
    <a href="{{ the_url }}">I'm linking to {{ the_url }}</a>

    若是視圖不存在,{% url ... as var %}語法不會致使錯誤。

    {% url 'some-url-name' as the_url %}
    {% if the_url %}
      <a href="{{ the_url }}">Link to optional stuff</a>
    {% endif %}

    若是使用urlconf的名稱空間網址,經過冒號指定徹底名稱,以下所示:

    {% url 'myapp:view-name' %}

    include

    組件

    加載指定的模板並以標籤內的參數渲染。這是一種引入別的模板的方法,要將include和extend區分開,include相似Python的import。

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

    也可使用變量名:
    {% include template_name %}

    下面這個示例生成輸出「Hello, John!」:

    context:變量greeting="Hello",變量person="John"。

    模板:

    {% include "name_snippet.html" %}

    name_snippet.html模板:

    {{ greeting }}, {{ person|default:"friend" }}!

    可使用關鍵字參數將額外的上下文傳遞到模板:

    {% include "name_snippet.html" with person="Jane" greeting="Hello" %}

    若是僅使用提供的變量來渲染上下文,添加only選項。

    {% include "name_snippet.html" with greeting="Hi" only %}

    將子模版渲染並嵌入當前HTML中的變種方法,不是解析子模版並在被父模版包含的狀況下展示其被父模版定義的內容。這意味着在不一樣的被包含的子模版之間並不共享父模版的狀態,每個子模板包含都是徹底獨立的渲染過程。

    load

    加載自定義模板標籤。

    下面的模板將會從somelibrary和package包中的otherlibrary中載入全部已經註冊的標籤和過濾器。

    {% load somelibrary package.otherlibrary %}

    還可使用from參數從庫中選擇性加載單個過濾器或標記。

    {% load foo bar from somelibrary %}

    Django內置標籤總覽

    能夠查詢下表來總覽Django的內置標籤:

    標籤 說明
    autoescape 自動轉義開關
    block 塊引用
    comment 註釋
    csrf_token CSRF令牌
    cycle 循環對象的值
    debug 調試模式
    extends 繼承模版
    filter 過濾功能
    firstof 輸出第一個不爲False的參數
    for 循環對象
    for … empty 帶empty說明的循環
    if 條件判斷
    ifequal 若是等於
    ifnotequal 若是不等於
    ifchanged 若是有變化,則..
    include 導入子模版的內容
    load 加載標籤和過濾器
    lorem 生成無用的廢話
    now 當前時間
    regroup 根據對象重組集合
    resetcycle 重置循環
    spaceless 去除空白
    templatetag 轉義模版標籤符號
    url 獲取url字符串
    verbatim 禁用模版引擎
    widthratio 寬度比例
    with 上下文變量管理器
    autoescape

    控制自動轉義是否可用。參數是on或off。 該標籤會以一個endautoescape做爲結束標籤.

    例如:

    {% autoescape on %}
        {{ body }}
    {% endautoescape %}
    cycle

    每當這個標籤被訪問,返回它的下一個元素。第一次訪問返回第一個元素,第二次訪問返回第二個參數,以此類推. 一旦全部的變量都被訪問過了,就會回到最開始的地方,重複下去。在循環中特別有用:

    {% for o in some_list %}
        <tr class="{% cycle 'row1' 'row2'%}">
            ...
        </tr>
    {% endfor %}

    cycle的本質是根據某個規律,提供某種特性,好比想循環給表格的行添加底色等等。

    也可使用變量, 例如,有兩個模版變量:rowvalue1和rowvalue2, 可讓他們的值像這樣替換:

    {% for o in some_list %}
        <tr class="{% cycle rowvalue1 rowvalue2 %}">
            ...
        </tr>
    {% endfor %}

    被包含在cycle中的變量將會被轉義。 能夠禁止自動轉義:

    {% for o in some_list %}
        <tr class="{% autoescape off %}{% cycle rowvalue1 rowvalue2 %}{% endautoescape %}">
            ...
        </tr>
    {% endfor %}

    能夠混合使用變量和字符串:

    {% for o in some_list %}
        <tr class="{% cycle 'row1rowvalue2 'row3' %}">
            ...
        </tr>
    {% endfor %}

    在某些狀況下,可能須要連續引用一個當前循環的值,而不前進到下一個循環值。要達到這個目的,只需使用as來給{% cycle %}取一個別名,就像這樣:

    {% cycle 'row1' 'row2' as rowcolors %}

    設置別名後,就能夠將別名看成一個模板變量進行引用,從而隨意在模板中插入當前循環的值。 若是要將循環值移動到原始cycle標記的下一個值,可使用另外一個cycle標記並指定變量的名稱。看下面的例子:

    <tr>
        <td class="{% cycle 'row1' 'row2as rowcolors %}">...</td>
        <td class="{{ rowcolors }}">...</td>
    </tr>
    <tr>
        <td class="{% cycle rowcolors %}">...</td>
        <td class="{{ rowcolors }}">...</td>
    </tr>

    將輸出:

    <tr>
        <td class="row1">...</td>
        <td class="row1">...</td>
    </tr>
    <tr>
        <td class="row2">...</td>
        <td class="row2">...</td>
    </tr>

    cycle 標籤中,經過空格分割,可使用任意數量的值。被包含在單引號(')或者雙引號(")中的值被認爲是可迭代字符串,相反,沒有被引號包圍的值被看成模版變量

    debug

    輸出整個調試信息,包括當前上下文和導入的模塊。

    filter

    經過一個或多個過濾器對內容過濾。須要結束標籤endfilter。

    例如:

    {% filter force_escape|lower %}
        This text will be HTML-escaped, and will appear in all lowercase.
    {% endfilter %}
    firstof

    輸出第一個不爲False參數。 若是傳入的全部變量都爲False,就什麼也不輸出。

    例如:

    {% firstof var1 var2 var3 %}

    它等價於:
    {% if var1 %}
        {{ var1 }}
    {% elif var2 %}
        {{ var2 }}
    {% elif var3 %}
        {{ var3 }}
    {% endif %}

    能夠用一個默認字符串做爲輸出以防止傳入的全部變量都是False:

    {% firstof var1 var2 var3 "fallback value" %}
    ifchanged

    檢查一個值是否在上一次的迭代中被改變了。

    {% ifchanged %}標籤一般用在循環裏。它有兩個用處:

    檢查已經渲染過的內容的當前狀態。而且只會顯示發生改變的內容。例如,如下的代碼是輸出days的列表項,不過它只會輸出被修改過月份的項:

    <h1>Archive for {{ year }}</h1>

    {% for date in days %}
        {% ifchanged %}<h3>{{ date|date:"F" }}</h3>{% endifchanged %}
        <a href="{{ date|date:"M/d"|lower }}/">{{ date|date:"j" }}</a>
    {% endfor %}

    若是標籤內有多個值時,則會比較每個值是否與上一次不一樣。例如,如下顯示每次更改時的日期,若是小時或日期已更改,則顯示小時:

    {% for date in days %}
        {% ifchanged date.date %} {{ date.date }} {% endifchanged %}
        {% ifchanged date.hour date.date %}
            {{ date.hour }}
        {% endifchanged %}
    {% endfor %}

    ifchanged標記也能夠採用可選的{% else %}將顯示值沒有改變的狀況:

    {% for match in matches %}
        <div style="background-color:
            {% ifchanged match.ballot_id %}
                {% cycle "
    red" "blue" %}
            {% else %}
                gray
            {% endifchanged %}
        "
    >{{ match }}</div>
    {% endfor %}
    lorem

    用來在模版中提供文字樣本以供測試用的。使用這個方法,能夠幫你自動填充一些能夠閱讀的內容。

    {% lorem [count] [method] [random] %}

    可使用零個,一個,兩個或三個參數。 這些參數是:

    • count :一個數字(或變量),其中包含要生成的段落或字數(默認值爲1)。
    • method:HTML中使用p標籤、仍是w標籤、仍是b標籤,決定文本格式。默認是「b」。
    • random:若是給出的話,random這個詞在生成文本時不會使用公共段落。 例子:
    {% lorem %}     # 將輸出常見的「lorem ipsum」段落。
    {% lorem 3 p %} # 輸出經常使用的「lorem ipsum」段落和兩個隨機段落,每段包裹在<p>標籤中。
    {% lorem 2 w random %} # 將輸出兩個隨機拉丁字。
    now

    顯示當前的日期或時間。能夠指定顯示的格式。 如:

    It is {% now "jS F Y H:i" %}

    下面的例子中,「o」和「f」都被反斜槓轉義:

    It is the {% now "jS \o\f F" %}

    # 這將顯示爲「It is the 4th of September」。

    還可使用語法{% now 「Y」 as current_year %}將輸出存儲在變量中。

    {% now "Y" as current_year %}
    {% blocktrans %}Copyright {{ current_year }}{% endblocktrans %}
    regroup

    用對象間共有的屬性重組列表。

    對於下面的數據:

    cities = [
        {'name''Mumbai''population''19,000,000''country''India'},
        {'name''Calcutta''population''15,000,000''country''India'},
        {'name''New York''population''20,000,000''country''USA'},
        {'name''Chicago''population''7,000,000''country''USA'},
        {'name''Tokyo''population''33,000,000''country''Japan'},
    ]

    若是你想顯示按國家/地區排序的分層列表,以下所示:

    India
        Mumbai: 19,000,000
        Calcutta: 15,000,000
    USA
        New York: 20,000,000
        Chicago: 7,000,000
    Japan
        Tokyo: 33,000,000

    可使用{% regroup %}標籤來給每一個國家的城市分組:

    {% regroup cities by country as country_list %}

    <ul>
    {% for country in country_list %}
        <li>{{ country.grouper }}
        <ul>
            {% for city in country.list %}
              <li>{{ city.name }}: {{ city.population }}</li>
            {% endfor %}
        </ul>
        </li>
    {% endfor %}
    </ul>

    {% regroup %}有三個參數: 要重組的列表、用來分組的屬性、結果列表的名字。在這裏,咱們經過country屬性從新分組cities列表,並將結果保存在country_list中。

    country_list的每一個元素是具備兩個字段的namedtuple()的實例:

    • grouper - 分組的項目(例如,字符串「India」或「Japan」)。
    • list - 此羣組中全部項目的列表(例如,全部城市的列表,其中country ='India')。
    resetcycle

    重置先前的循環,以便在下一次循環時從其第一個項目從新啓動。若是沒有參數,{% resetcycle %}將重置最後一個{% cycle %}。例:

    {% for coach in coach_list %}
        <h1>{{ coach.name }}</h1>
        {% for athlete in coach.athlete_set.all %}
            <p class="{% cycle 'odd' 'even' %}">{{ athlete.name }}</p>
        {% endfor %}
        {% resetcycle %}
    {% endfor %}

    這個示例將返回下面的HTML:

    <h1>José Mourinho</h1>
    <p class="odd">Thibaut Courtois</p>
    <p class="even">John Terry</p>
    <p class="odd">Eden Hazard</p>

    <h1>Carlo Ancelotti</h1>
    <p class="odd">Manuel Neuer</p> # 第一個塊以class="odd"結束,新的以class="odd"開頭。沒有`{% resetcycle %}`標籤,第二個塊將以class="even"開始。
    <p class="even">Thomas Müller</p>

    還能夠重置循環標籤:

    {% for item in list %}
        <p class="{% cycle 'odd' 'evenas stripe %} {% cycle 'major' 'minor' 'minor' 'minor' 'minoras tick %}">
            {{ item.data }}
        </p>
        {% ifchanged item.category %}
            <h1>{{ item.category }}</h1>
            {% if not forloop.first %}{% resetcycle tick %}{% endif %}
        {% endifchanged %}
    {% endfor %}

    在這個例子中,交替的奇數/偶數行和每五行出現一次的‘major’行。當類別更改時,只有五行週期被重置。

    spaceless

    刪除HTML標籤之間的空白,包括製表符和換行。例:

    {% spaceless %}
        <p>
            <a href="foo/">Foo</a>
        </p>
    {% endspaceless %}

    # 將返回下面的HTML:
    <p><a href="foo/">Foo</a></p>

    僅會刪除tags之間的空格,不會刪除標籤和文本之間的。例:

    {% spaceless %}
        <strong>
            Hello        # Hello周圍的空格不會被刪除
        </strong>
    {% endspaceless %}
    templatetag

    輸出用於構成模板標籤的語法字符。

    因爲模板系統沒有「轉義」的概念,沒法在HTML中使用‘\’轉義出相似{%的字符。爲了顯示模板標籤自己,必須使用{% templatetag %}標籤,並添加相應的參數:

    • openblock:{%
    • closeblock: %}
    • openvariable: {{
    • closevariable: }}
    • openbrace :{
    • closebrace: }
    • opencomment: {#
    • closecomment: #}

    例如:

    {% templatetag openblock %} url 'entry_list' {% templatetag closeblock %}
    verbatim

    禁止模版引擎在該標籤中進行渲染工做。

    常見的用法是容許與Django語法衝突的JavaScript模板圖層工做。 像這樣:

    {% verbatim %}
        {{if dying}}Still alive.{{/if}}
    {% endverbatim %}
    widthratio

    爲了建立柱狀形圖,此標籤計算給定值與最大值的比率,而後將該比率應用於常量。

    如:

    <img src="bar.png" alt="Bar"
         height="10" width="{% widthratio this_value max_value max_width %}" />

    若是this_value是175,max_value是200,而且max_width是100,則示例中的圖像將是88像素寬(由於175 / 200 = .875; .875 * 100 = 87.5,四捨五入入爲88)。

    相關文章
    相關標籤/搜索