欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

詳解Python的Django框架中的模版繼承

系統 1608 0

在實際應用中,你將用 Django 模板系統來創建整個 HTML 頁面。 這就帶來一個常見的 Web 開發問題: 在整個網站中,如何減少共用頁面區域(比如站點導航)所引起的重復和冗余代碼?

解決該問題的傳統做法是使用 服務器端的 includes ,你可以在 HTML 頁面中使用該指令將一個網頁嵌入到另一個中。 事實上, Django 通過剛才講述的 {% include %} 支持了這種方法。 但是用 Django 解決此類問題的首選方法是使用更加優雅的策略―― 模板繼承 。

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

讓我們通過修改 current_datetime.html 文件,為 current_datetime 創建一個更加完整的模板來體會一下這種做法:

            
              The current time
            
            

My helpful timestamp site

It is now {{ current_date }}.


Thanks for visiting my site.

這看起來很棒,但如果我們要為第三章的 hours_ahead 視圖創建另一個模板會發生什么事情呢?

              
                Future time
              
              

My helpful timestamp site

In {{ hour_offset }} hour(s), it will be {{ next_time }}.


Thanks for visiting my site.

很明顯,我們剛才重復了大量的 HTML 代碼。 想象一下,如果有一個更典型的網站,它有導航條、樣式表,可能還有一些 JavaScript 代碼,事情必將以向每個模板填充各種冗余的 HTML 而告終。

解決這個問題的服務器端 include 方案是找出兩個模板中的共同部分,將其保存為不同的模板片段,然后在每個模板中進行 include。 也許你會把模板頭部的一些代碼保存為 header.html 文件:

          

你可能會把底部保存到文件 footer.html :

            

Thanks for visiting my site.

對基于 include 的策略,頭部和底部的包含很簡單。 麻煩的是中間部分。 在此范例中,每個頁面都有一個

My helpful timestamp site

標題,但是這個標題不能放在 header.html 中,因為每個頁面的 是不同的。 如果我們將 <h1> 包含在頭部,我們就不得不包含 <title> ,但這樣又不允許在每個頁面對它進行定制。 何去何從呢?</p> <p>Django 的模板繼承系統解決了這些問題。 你可以將其視為服務器端 include 的逆向思維版本。 你可以對那些 不同 的代碼段進行定義,而不是 共同 代碼段。</p> <p>第一步是定義 基礎模板 , 該框架之后將由 子模板 所繼承。 以下是我們目前所講述范例的基礎模板:</p> <div class="jb51code"> <pre class="brush:py;"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="en"> <head> <title>{% block title %}{% endblock %}

My helpful timestamp site

{% block content %}{% endblock %} {% block footer %}

Thanks for visiting my site.

{% endblock %}

這個叫做 base.html 的模板定義了一個簡單的 HTML 框架文檔,我們將在本站點的所有頁面中使用。 子模板的作用就是重載、添加或保留那些塊的內容。 (如果你一直按順序學習到這里,保存這個文件到你的template目錄下,命名為 base.html .)

我們使用一個以前已經見過的模板標簽: {% block %} 。 所有的 {% block %} 標簽告訴模板引擎,子模板可以重載這些部分。 每個{% block %}標簽所要做的是告訴模板引擎,該模板下的這一塊內容將有可能被子模板覆蓋。

現在我們已經有了一個基本模板,我們可以修改 current_datetime.html 模板來 使用它:

          
{% extends "base.html" %}

{% block title %}The current time{% endblock %}

{% block content %}

          

It is now {{ current_date }}.

{% endblock %}

再為 hours_ahead 視圖創建一個模板,看起來是這樣的:

          
{% extends "base.html" %}

{% block title %}Future time{% endblock %}

{% block content %}

          

In {{ hour_offset }} hour(s), it will be {{ next_time }}.

{% endblock %}

看起來很漂亮是不是? 每個模板只包含對自己而言 獨一無二 的代碼。 無需多余的部分。 如果想進行站點級的設計修改,僅需修改 base.html ,所有其它模板會立即反映出所作修改。

以下是其工作方式。 在加載 current_datetime.html 模板時,模板引擎發現了 {% extends %} 標簽, 注意到該模板是一個子模板。 模板引擎立即裝載其父模板,即本例中的 base.html 。

此時,模板引擎注意到 base.html 中的三個 {% block %} 標簽,并用子模板的內容替換這些 block 。因此,引擎將會使用我們在 { block title %} 中定義的標題,對 {% block content %} 也是如此。 所以,網頁標題一塊將由 {% block title %}替換,同樣地,網頁的內容一塊將由 {% block content %}替換。

注意由于子模板并沒有定義 footer 塊,模板系統將使用在父模板中定義的值。 父模板 {% block %} 標簽中的內容總是被當作一條退路。

繼承并不會影響到模板的上下文。 換句話說,任何處在繼承樹上的模板都可以訪問到你傳到模板中的每一個模板變量。

你可以根據需要使用任意多的繼承次數。 使用繼承的一種常見方式是下面的三層法:

  • ??? 創建 base.html 模板,在其中定義站點的主要外觀感受。 這些都是不常修改甚至從不修改的部分。
  • ??? 為網站的每個區域創建 base_SECTION.html 模板(例如, base_photos.html 和 base_forum.html )。這些模板對 base.html 進行拓展,并包含區域特定的風格與設計。
  • ??? 為每種類型的頁面創建獨立的模板,例如論壇頁面或者圖片庫。 這些模板拓展相應的區域模板。

這個方法可最大限度地重用代碼,并使得向公共區域(如區域級的導航)添加內容成為一件輕松的工作。

以下是使用模板繼承的一些訣竅:

  • ??? 如果在模板中使用 {% extends %} ,必須保證其為模板中的第一個模板標記。 否則,模板繼承將不起作用。
  • ??? 一般來說,基礎模板中的 {% block %} 標簽越多越好。 記住,子模板不必定義父模板中所有的代碼塊,因此你可以用合理的缺省值對一些代碼塊進行填充,然后只對子模板所需的代碼塊進行(重)定義。 俗話說,鉤子越多越好。
  • ??? 如果發覺自己在多個模板之間拷貝代碼,你應該考慮將該代碼段放置到父模板的某個 {% block %} 中。
  • ??? 如果你需要訪問父模板中的塊的內容,使用 {{ block.super }}這個標簽吧,這一個魔法變量將會表現出父模板中的內容。 如果只想在上級代碼塊基礎上添加內容,而不是全部重載,該變量就顯得非常有用了。
  • ??? 不允許在同一個模板中定義多個同名的 {% block %} 。 存在這樣的限制是因為block 標簽的工作方式是雙向的。 也就是說,block 標簽不僅挖了一個要填的坑,也定義了在父模板中這個坑所填充的內容。如果模板中出現了兩個相同名稱的 {% block %} 標簽,父模板將無從得知要使用哪個塊的內容。
  • ??? {% extends %} 對所傳入模板名稱使用的加載方法和 get_template() 相同。 也就是說,會將模板名稱被添加到 TEMPLATE_DIRS 設置之后。
  • ??? 多數情況下, {% extends %} 的參數應該是字符串,但是如果直到運行時方能確定父模板名,這個參數也可以是個變量。 這使得你能夠實現一些很酷的動態功能。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 一本一道久久综合狠狠老 | 国产免费中文字幕 | 天天伊人网 | 99国产精品久久久 | 日韩精品不卡 | 国产午夜精品一区二区三区嫩草 | 91青青国产在线观看免费 | 亚洲国产91| 奇米影视7777久久精品人人爽 | 日本免费网站 | 欧美高清成人 | 亚洲免费人成在线视频观看 | 色诱成人免费观看视频 | 一区二区在线 | 色福利网| 国产精品第一区 | 国产肝交视频在线观看 | 国产精品视频免费的 | 日韩激情中文字幕一区二区 | 精品国产99 | 久久丁香视频 | 婷婷激情久久 | 特黄特色的免费大片看看 | 久久国内精品自在自线400部o | 日韩精品视频一区二区三区 | 在线观看亚洲a | 亚洲国产精品第一区二区三区 | 亚洲欧美激情精品一区二区 | 国产精品亚洲成在人线 | 久久久久成人网 | 欧美伦理一区 | 啪啪天堂| 91精品国产免费久久 | 美女国内精品自产拍在线播放 | 欧美日韩一区二区三区高清不卡 | 黄色视屏免费看 | 毛片网站大全 | 色屁屁www影院免费观看视频 | 猫鼠游戏电影在线观看免费版 | 天天摸天天爽天天澡视频 | 九九九热在线精品免费全部 |