日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > Python > 正文

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

2020-01-04 18:03:31
字體:
供稿:網(wǎng)友

這篇文章主要介紹了詳解Python的Django框架中的模版繼承,就像Python中面對對象的方法繼承道理類似,需要的朋友可以參考下

在實際應(yīng)用中,你將用 Django 模板系統(tǒng)來創(chuàng)建整個 HTML 頁面。 這就帶來一個常見的 Web 開發(fā)問題: 在整個網(wǎng)站中,如何減少共用頁面區(qū)域(比如站點導(dǎo)航)所引起的重復(fù)和冗余代碼?

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

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

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

 

 
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  2. <html lang="en"
  3. <head> 
  4. <title>The current time</title> 
  5. </head> 
  6. <body> 
  7. <h1>My helpful timestamp site</h1> 
  8. <p>It is now {{ current_date }}.</p> 
  9.  
  10. <hr> 
  11. <p>Thanks for visiting my site.</p> 
  12. </body> 
  13. </html> 

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

 

 
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  2. <html lang="en"
  3. <head> 
  4. <title>Future time</title> 
  5. </head> 
  6. <body> 
  7. <h1>My helpful timestamp site</h1> 
  8. <p>In {{ hour_offset }} hour(s), it will be {{ next_time }}.</p> 
  9.  
  10. <hr> 
  11. <p>Thanks for visiting my site.</p> 
  12. </body> 
  13. </html> 

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

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

 

 
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  2. <html lang="en"
  3. <head> 

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

 

 
  1. <hr> 
  2. <p>Thanks for visiting my site.</p> 
  3. </body> 
  4. </html> 

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

My helpful timestamp site

標題,但是這個標題不能放在 header.html 中,因為每個頁面的

包含在頭部,我們就不得不包含

 

Django 的模板繼承系統(tǒng)解決了這些問題。 你可以將其視為服務(wù)器端 include 的逆向思維版本。 你可以對那些 不同 的代碼段進行定義,而不是 共同 代碼段。

第一步是定義 基礎(chǔ)模板 , 該框架之后將由 子模板 所繼承。 以下是我們目前所講述范例的基礎(chǔ)模板:

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  2. <html lang="en"
  3. <head> 
  4. <title>{% block title %}{% endblock %}</title> 
  5. </head> 
  6. <body> 
  7. <h1>My helpful timestamp site</h1> 
  8. {% block content %}{% endblock %} 
  9. {% block footer %} 
  10. <hr> 
  11. <p>Thanks for visiting my site.</p> 
  12. {% endblock %} 
  13. </body> 
  14. </html> 


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

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

現(xiàn)在我們已經(jīng)有了一個基本模板,我們可以修改 current_datetime.html 模板來 使用它:

 

 
  1. {% extends "base.html" %} 
  2.  
  3. {% block title %}The current time{% endblock %} 
  4.  
  5. {% block content %} 
  6. <p>It is now {{ current_date }}.</p> 
  7. {% endblock %} 

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

 

 
  1. {% extends "base.html" %} 
  2.  
  3. {% block title %}Future time{% endblock %} 
  4.  
  5. {% block content %} 
  6. <p>In {{ hour_offset }} hour(s), it will be {{ next_time }}.</p> 
  7. {% endblock %} 

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

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

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

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

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

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

創(chuàng)建 base.html 模板,在其中定義站點的主要外觀感受。 這些都是不常修改甚至從不修改的部分。

為網(wǎng)站的每個區(qū)域創(chuàng)建 base_SECTION.html 模板(例如, base_photos.html 和 base_forum.html )。這些模板對 base.html 進行拓展,并包含區(qū)域特定的風(fēng)格與設(shè)計。

為每種類型的頁面創(chuàng)建獨立的模板,例如論壇頁面或者圖片庫。 這些模板拓展相應(yīng)的區(qū)域模板。

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

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

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

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

如果發(fā)覺自己在多個模板之間拷貝代碼,你應(yīng)該考慮將該代碼段放置到父模板的某個 {% block %} 中。

如果你需要訪問父模板中的塊的內(nèi)容,使用 {{ block.super }}這個標簽吧,這一個魔法變量將會表現(xiàn)出父模板中的內(nèi)容。 如果只想在上級代碼塊基礎(chǔ)上添加內(nèi)容,而不是全部重載,該變量就顯得非常有用了。

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

{% extends %} 對所傳入模板名稱使用的加載方法和 get_template() 相同。 也就是說,會將模板名稱被添加到 TEMPLATE_DIRS 設(shè)置之后。

多數(shù)情況下, {% extends %} 的參數(shù)應(yīng)該是字符串,但是如果直到運行時方能確定父模板名,這個參數(shù)也可以是個變量。 這使得你能夠?qū)崿F(xiàn)一些很酷的動態(tài)功能。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
精品av中文字幕在线毛片| 日韩不卡中文字幕| 精品视频国产| www.中文字幕在线观看| 91精品国产丝袜白色高跟鞋| 国产欧美中文字幕| 在线看的av| 中文字幕 欧美 日韩| 九一久久久久久| 日韩精品视频免费播放| 欧美日韩夫妻久久| 欧美日韩视频网站| 中文字幕人成乱码在线观看| 国产一区成人| 亚洲a中文字幕| 91极品视频在线观看| 精品国产乱码一区二区| 精品国产31久久久久久| 一级特黄aaa大片在线观看| 国产欧美日韩在线观看| 91精品综合久久| 日韩综合精品| 中文字幕精品在线| 国产色在线 com| 日韩欧美在线影院| 中文在线第一页| 国产欧美第一页| 国产一卡2卡3卡四卡网站| 欧美日韩在线不卡| 91精品国产自产在线观看永久∴| 久久精品一级爱片| 日本不卡免费高清视频| 久久91精品久久久久久秒播| 国产视频中文字幕在线观看| av免费在线不卡| 91精品在线视频观看| 91精品xxx在线观看| 国产不卡视频在线| 国产黄色一区| 在线观看区一区二| 视频一区二区国产| 精品日韩在线观看| 精品国产31久久久久久| 高清一区二区| 中文字幕日韩欧美在线| 欧美日韩国产一二| 欧美日韩国产亚洲一区| 亚洲一区精品在线| 国产福利精品导航| 日韩视频 中文字幕| 91精品国产网站| 日韩综合精品| 国产日韩免费| 天堂中文在线视频| 日韩在线视频免费观看| 在线中文免费视频| 日韩欧美国产片| av免费观看国产| 日韩国产成人精品| 中文字幕亚洲一区在线观看| 国产欧美综合在线观看第十页| 在线观看91精品国产入口| 国产欧美日韩综合| 欧美 日韩 国产 在线观看| 婷婷精品视频| 91精品国产手机| av免费看在线| 欧美三级日本三级少妇99| 欧美日韩亚洲天堂| 成年人黄国产| 日韩国产欧美在线视频| 国产调教精品| 国产成人综合av| 国产黄色在线免费观看| 日韩在线中文| av免费在线播放| 国产欧美日韩亚州综合| 国产免费一级| 亚洲第一视频网站| 久久福利视频一区二区| 日韩欧美高清在线| www.尤物.com| 不卡在线视频| 亚洲深夜福利| 久久99久久99精品中文字幕| 国产一区高清视频| 国产视频三级在线观看播放| 天天综合天天做| 快she精品国产999| 亚洲第一福利视频在线| 午夜视频在线观看一区| 欧美婷婷精品激情| 黄色一区二区在线| eeuss一区| 中文字幕日韩欧美在线视频| 综合激情国产一区| 亚洲视频一二三四| 精品国产99| 日韩欧美一二三| 久精品在线观看| 亚洲开心激情| av中文在线播放| 91精品国产自产91精品| 欧美不卡123| 国内精品露脸在线视频播放| 欧美日韩视频不卡| 日本国产在线视频| 国产日韩成人精品| 国产永久在线观看| 欧美日韩视频网站| √新版天堂资源在线资源| 国产高清一区| 国产主播中文字幕| 99视频在线看| 一二三区精品视频| 国产激情三区| 中文字幕在线日韩| 91精品国产综合久久香蕉最新版 | 中文字幕在线视频精品| www..com日韩| 午夜少妇久久久久久久久| 欧美在线中文字幕| 中文字幕欧美日韩va免费视频| 亚洲视频中文字幕| av免费观看网站| 亚洲中午字幕| 一区二区三区精品99久久| 天天综合日日夜夜精品| 日韩中文字幕在线视频播放| 国产亚洲二区| 亚洲成人7777| 日韩黄色在线播放| 国产一级片在线播放| 国产一二三区精品视频| 日韩欧美国产成人精品免费| 欧美成人一区二区| 亚洲欧美中文字幕在线观看| 91精品国产91久久| 在线免费视频一区二区| 一区二区三区四区五区视频在线观看| 国产欧美在线观看| 人妻一区二区三区免费| 日韩欧美中文字幕在线视频| 国产在线观看精品| 国产123在线| 国产欧美日韩不卡| 国产在线欧美| 亚洲欧美中文字幕在线观看| 亚洲日本精品视频| 91精品高清| 拍真实国产伦偷精品| 日本a级黄色| 久草中文在线观看| 亚洲成av人片一区二区密柚| 久久99久久久久久久噜噜| 国产网站av| 99在线精品视频免费观看20| 日韩精品―中文字幕| 日韩在线观看a| 亚洲女人天堂色在线7777| 日韩在线 中文字幕| 欧美国产亚洲一区| 免费在线观看国产黄| 欧美一级免费看| 在线国产91| 午夜伊人狠狠久久| 亚洲最新永久观看在线| 91精品国产自产在线观看永久∴| 国产在线一区二区视频| 日韩欧美国产成人精品免费| 欧美日本精品| 一区二区日韩免费看| 日韩欧美中文字幕在线观看| av免费在线播放| 91精品视频观看| 亚洲高清免费一级二级三级| 欧美日韩一二| 中文字幕2020第一页| 日本亚洲欧美三级| √新版天堂资源在线资源| 国产日韩在线视频| 97caopor国产在线视频| 刘玥91精选国产在线观看| 欧美日韩亚洲视频| 免费精品国产自产拍在| 精品国产免费视频| 在线日韩中文| 亚洲女同中文字幕| 久艹在线视频| 国产在线不卡av| 国产欧美日韩成人| 欧美在线中文字幕| 欧美日韩精品综合| 亚洲综合日韩欧美| 不卡一二三区| 精品一区二区三区中文字幕在线| 久久久99精品久久| 中文字幕日韩精品在线| 区日韩二区欧美三区| 999精品网| 日韩亚洲一区中文字幕| 国产成人va亚洲电影| 欧美黄页在线免费观看| 精品欧美日韩| 久久久99久久| 精品一二三四区| 成人一区二区不卡免费| 国产成人精品999在线观看| 国产视频不卡| 国产黄色高清在线| 日韩中文字幕久久| 精品色蜜蜜精品视频在线观看| 伊人网站在线| 黄色一级大片在线免费看国产一| 日本a级黄色| 欧美婷婷久久| 午夜亚洲福利| 欧美日韩成人综合| 亚洲第一页中文字幕| 一区二区三区精品在线| 日韩欧美不卡视频| 国产欧美日韩精品高清二区综合区| 久草视频在线看| 国产 欧美在线| 精品国产99| 欧美一级久久| 欧洲精品久久久| 亚洲欧美999| 丰满少妇一区| 久久精品日韩无码| 欧美国产综合在线V| 日韩中文字幕观看| 免费在线视频一级不卡| 国产不卡视频在线| 亚洲欧美中文字幕在线观看| 中文天堂在线一区| 中文字幕亚洲字幕| 热久久精品国产| 欧美日韩精品不卡| 国产在线一区二区视频| 欧美日韩第一| 国产999在线观看| 一区二区精品免费| 日本a级黄色| 日韩三级在线播放| 韩国一区二区av| 欧美日韩三级在线| 青青国产91久久久久久| 欧美日韩国产中文| 国产资源中文字幕| 久久视频www| 日韩精品视频在线观看免费| 亚洲一区在线观看免费| 最近中文字幕日韩精品| 韩国一区二区av| 国产福利一区二区| 日韩精品免费视频一区二区三区| 欧美日韩在线第一页| 国产在线日韩精品| 精品视频资源站| 精品无人国产偷自产在线| 国产欧美中文在线| 日本国产在线视频| 欧美日韩亚洲第一| 亚洲国产综合久久| 国产在线欧美日韩| 中文字幕在线视频网| 国产最新在线| 精品乱人伦一区二区三区| 伊人国产视频| 久久精品久久精品国产大片| 国产三级中文字幕| 中文在线视频观看| 日本熟女一区二区| 国产一卡2卡3卡免费网站| 欧美日韩精品电影| 国产aa精品| 麻豆精品视频入口| 91精品在线视频观看| 中文字幕 欧美 日韩| 亚洲视频色图| 日韩欧美亚洲国产一区| 精品人妻一区二区三区视频| 午夜亚洲一区| 日韩精品第一区| 久草视频观看| 亚洲第一视频在线观看| av中文天堂在线| 国产在线精品国自产拍免费| 国产在线播放一区二区| 国产视频97| 中文字幕在线中文字幕二区| 亚洲免费在线视频一区 二区| 精品视频在线视频| 91久久精品国产91久久| 欧美日韩成人综合| 九九精品调教| 国产综合精品在线| 欧美日韩中文字幕在线观看| 精品在线91| 亚洲一区精品在线| 正在播放日韩精品| 久久激情一区| 国产欧美日韩在线播放| 日本免费看黄| 亚洲三级国产| 国产黄色片大全| 欧美日韩亚洲国内综合网| 黄色一级大片在线免费看国产一| wwwwww在线观看| 天天综合色天天| 韩国v欧美v日本v亚洲| 欧美日韩激情一区二区三区| 日韩亚洲欧美中文高清在线| 日韩免费高清一区二区| 91精品国产亚洲| 日韩不卡高清视频| 色综合婷婷久久| 日韩精品三级| 人人做人人澡人人爽欧美| 亚洲大胆人体av| 91精品国产99| 欧美va亚洲va日韩∨a综合色| 国产日产一区二区| 欧美日韩激情一区| 一区二区日韩免费看| 日本精品福利视频| 欧美乱大交xxxxx另类| 日韩中文字幕久久| 精品国自产在线观看| 中文在线一区| 欧美中文字幕在线| 日韩精品视频在线观看网址| 77777_亚洲午夜久久多人| 高清在线一区| 中文字幕久久av| 国产欧美日韩在线观看| 久久精品夜夜夜夜久久| 中文字幕精品视频| 九九在线精品| www中文字幕在线观看| 欧美一卡2卡三卡4卡5免费| 久久99精品久久久久子伦| 在线观看一区| 91欧美日韩| 91精品国产自产在线| 久久视频在线免费观看| 国产成人精品免费久久久久| 国产黄色在线网站| 日韩精品 欧美| 久久久91精品国产| 欧美日韩高清| 色一区在线观看| 日本中文字幕在线观看| 亚洲女同中文字幕| 日韩欧美一级精品久久| 欧美日韩在线不卡| 欧美国产一级片| 亚洲国产专区| 日韩福利视频导航| 日本黄色一区二区三区| 国产一级一片免费播放| 久久久综合av| 日韩中文字幕视频在线观看| 欧美亚洲天堂网| 日韩精品在线播放| 日韩三级视频在线播放| 内射国产内射夫妻免费频道| wwwav91com| 国产欧美日韩不卡免费| 日韩精品一区二区三区视频播放| 精品国产欧美日韩| 国产免费一级片| 91精品国产高清久久久久久| 国产黄色在线网站| 日韩精品首页| 中文字幕亚洲二区 | 欧美一卡2卡3卡4卡| 美女黄a一级视频| 亚洲娇小xxxx欧美娇小| av免费网站在线| 中文天堂资源在线| 91一区二区| 中文字幕亚洲视频| 欧美日韩在线精品成人综合网 | 日韩国产欧美| 精品在线一区二区| 久久精品日韩无码| 一区二区视频在线| 91精品在线观看入口| 国产一区不卡精品| 欧美久久一二三四区| 九一久久久久久| 亚洲国产91精品在线观看| 久久精品日韩欧美| 精品播放一区二区| 亚洲成av人片| 大香一本蕉伊线亚洲网| 国产一卡2卡3卡4卡网站免费| 精品一二三四|