国产chinesehdxxxx野外,国产av无码专区亚洲av琪琪,播放男人添女人下边视频,成人国产精品一区二区免费看,chinese丰满人妻videos

模板繼承

2018-02-24 15:39 更新

Jinja 中最強(qiáng)大的部分就是模板繼承。模板繼承允許你構(gòu)建一個(gè)包含你站點(diǎn)共同元素的基 本模板“骨架”,并定義子模板可以覆蓋的??。

聽起來復(fù)雜,實(shí)際上很簡(jiǎn)單。從例子上手是最易于理解的。

基本模板

這個(gè)模板,我們會(huì)把它叫做?base.html?,定義了一個(gè)簡(jiǎn)單的 HTML 骨架文檔,你可 能使用一個(gè)簡(jiǎn)單的兩欄頁面。用內(nèi)容填充空的塊是子模板的工作:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    {% block head %}
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}{% endblock %} - My Webpage</title>
    {% endblock %}
</head>
<body>
    <div id="content">{% block content %}{% endblock %}</div>
    <div id="footer">
        {% block footer %}
        &copy; Copyright 2008 by <a  rel="external nofollow" target="_blank" >you</a>.
        {% endblock %}
    </div>
</body>

在本例中,?{%?block?%}?標(biāo)簽定義了四個(gè)字幕版可以填充的塊。所有的?block?標(biāo)簽 告訴模板引擎子模板可以覆蓋模板中的這些部分。

子模板

一個(gè)子模板看起來是這樣:

{% extends "base.html" %}
{% block title %}Index{% endblock %}
{% block head %}
    {{ super() }}
    <style type="text/css">
        .important { color: #336699; }
    </style>
{% endblock %}
{% block content %}
    <h1>Index</h1>
    <p class="important">
      Welcome on my awesome homepage.
    </p>
{% endblock %}

{%?extend?%}?標(biāo)簽是這里的關(guān)鍵。它告訴模板引擎這個(gè)模板“繼承”另一個(gè)模板。 當(dāng)模板系統(tǒng)對(duì)這個(gè)模板求值時(shí),首先定位父模板。 extends 標(biāo)簽應(yīng)該是模板中的第一個(gè) 標(biāo)簽。它前面的所有東西都會(huì)按照普通情況打印出來,而且可能會(huì)導(dǎo)致一些困惑。更多 該行為的細(xì)節(jié)以及如何利用它,見?Null-Master 退回?。

模板的文件名依賴于模板加載器。例如?FileSystemLoader?允許你用文件名訪 問其它模板。你可以使用斜線訪問子目錄中的模板:

{% extends "layout/default.html" %}

這種行為也可能依賴于應(yīng)用內(nèi)嵌的 Jinja 。注意子模板沒有定義?footer?塊,會(huì) 使用父模板中的值。

你不能在同一個(gè)模板中定義多個(gè)同名的?{%?block?%}?標(biāo)簽。因?yàn)閴K標(biāo)簽以兩種 方向工作,所以存在這種限制。即一個(gè)塊標(biāo)簽不僅提供一個(gè)可以填充的部分,也在父級(jí) 定義填充的內(nèi)容。如果同一個(gè)模板中有兩個(gè)同名的?{%?blok?%}?標(biāo)簽,父模板 無法獲知要使用哪一個(gè)塊的內(nèi)容。

如果你想要多次打印一個(gè)塊,無論如何你可以使用特殊的?self?變量并調(diào)用與塊同名 的函數(shù):

<title>{% block title %}{% endblock %}</title>
<h1>{{ self.title() }}</h1>
{% block body %}{% endblock %}

Super 塊

可以調(diào)用?super?來渲染父級(jí)塊的內(nèi)容。這會(huì)返回父級(jí)塊的結(jié)果:

{% block sidebar %}
    <h3>Table Of Contents</h3>
    ...
    {{ super() }}
{% endblock %}

命名塊結(jié)束標(biāo)簽

Jinja2 允許你在塊的結(jié)束標(biāo)簽中加入的名稱來改善可讀性:

{% block sidebar %}
    {% block inner_sidebar %}
        ...
    {% endblock inner_sidebar %}
{% endblock sidebar %}

無論如何,?endblock?后面的名稱一定與塊名匹配。

嵌套塊和作用域

嵌套塊可以勝任更復(fù)雜的布局。而默認(rèn)的塊不允許訪問塊外作用域中的變量:

{% for item in seq %}
    <li>{% block loop_item %}{{ item }}{% endblock %}</li>
{% endfor %}

這個(gè)例子會(huì)輸出空的??項(xiàng),因?yàn)?item?在塊中是不可用的。其原因是,如果 塊被子模板替換,變量在其塊中可能是未定義的或未被傳遞到上下文。

從 Jinja 2.2 開始,你可以顯式地指定在塊中可用的變量,只需在塊聲明中添加?scoped?修飾,就把塊設(shè)定到作用域中:

{% for item in seq %}
    <li>{% block loop_item scoped %}{{ item }}{% endblock %}</li>
{% endfor %}

當(dāng)覆蓋一個(gè)塊時(shí),不需要提供?scoped?修飾。

模板對(duì)象

Changed in version 2.4.

當(dāng)一個(gè)模板對(duì)象被傳遞到模板上下文,你也可以從那個(gè)對(duì)象繼承。假設(shè)調(diào)用 代碼傳遞layout_template?布局模板到環(huán)境,這段代碼會(huì)工作:

{% extends layout_template %}

之前?layout_template?變量一定是布局模板文件名的字符串才能工作。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)