詳解Django模板層過濾器和繼承的問題
過濾器
模板層對變量的操作實際還有很多,過濾器就是其中一種。學(xué)過Linux系統(tǒng)的一定知道管道操作符,其可以將上一步輸出直接作為下一步輸入進行處理,這里的過濾器就是類似管道符,其寫法也是以管道符|
為標(biāo)志,允許我們對模板層獲得的變量進行改變,例如大小寫轉(zhuǎn)換、增減大小等等
語法
{{ 變量|過濾器1|過濾器2:'值' |...}}
這里的過濾器可以分為兩類,一類是不帶參數(shù)的,例如lower,upper,safe
;一類是帶參數(shù)的add:'10'
,冒號分隔,后面跟上值
過濾器 | 示例 | 說明 |
---|---|---|
lower | {{str | lower}} |
upper | {{str | upper}} |
safe | {{script | safe}} |
add | {{num | add:‘10'}} |
示例:
views.py
def home(request): dic = {} dic['str'] = 'abc' dic['num'] = 90 dic['script'] = '<script>alert("這是測試過濾器safe")</script>' #簡單的js代碼,可以彈出一個窗口 return render(request, 'home.html', dic)
home.html
<body> <h2>過濾器upper: {{ str|upper }}</h2> # 全變成大寫字母 <h2>過濾器add: {{ num|add:'10' }}</h2> # 加10 <h2>過濾器safe: {{ script|safe }}</h2> # 不進行html轉(zhuǎn)義,適用直接執(zhí)行js代碼,理解為代碼安全可以直接執(zhí)行 </body>
如果不適用safe
則輸出原始字符串,不會執(zhí)行js代碼
除了以上過濾器,更多過濾器請參見https://docs.djangoproject.com/zh-hans/3.2/ref/templates/builtins
繼承
對于某個網(wǎng)站來說,一般又比較統(tǒng)一的風(fēng)格,例如無論點擊網(wǎng)頁哪個標(biāo)簽或者鏈接,導(dǎo)航欄和尾部都是基本一樣的內(nèi)容,真正變的是中間的內(nèi)容區(qū)域,如何才能讓不同的網(wǎng)頁有相同也有差異呢,django中對模板可以使用繼承的概念。
例如,有如下頁面,由三部分組成,第一塊是導(dǎo)航欄,無論哪個子頁面均是一樣,中間body區(qū)會因為點擊導(dǎo)航欄不同項目發(fā)生變化,而最后一塊尾部每個頁面都是一樣,如何實現(xiàn)上述要求呢?
- 求同:Django模板層通過
{% extends 'home.html' %}
實現(xiàn)子頁面對home.html的繼承,也就是說只需要在每個子頁面寫上該行代碼即能完成對父頁面的繼承,但是需要注意的是不能繼承父頁面的相關(guān)視圖函數(shù)的變量 - 存異:在父頁面(home.html)中使用
{% block block_name %}...{% endblock block_name(可選) %}
標(biāo)記塊,凡是在標(biāo)記塊中的內(nèi)容在子頁面都可以被修改,修改方法是在{% block block_name %}子頁面重寫內(nèi)容{% endblock block_name(可選) %}
塊中重新更改內(nèi)容即可
home.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <!-- 導(dǎo)航欄,每個頁面都一樣 --> <h2> <a href="/home" rel="external nofollow" >主頁</a> <a href="/music" rel="external nofollow" >音樂頻道</a> <a href="/sport" rel="external nofollow" >運動頻道</a> </h2> <h2> {% block body %} <h2>歡迎來到主頁?。ㄔ摬糠謪^(qū)域因頁面而異)</h2> {% endblock %} <h3>如有問題請請聯(lián)系xxx@163.com(每個頁面都一樣)</h3> </body> </html>
music.html
{% extends 'home.html' %} <!-- 修改body區(qū)域內(nèi)容 --> {% block body %} <h2>歡迎來到音樂頻道!</h2> {% endblock %}
sport.html
{% extends 'home.html' %} <!-- 修改body區(qū)域內(nèi)容 --> {% block body %} <h2>歡迎來到運動頻道!</h2> {% endblock %}
views.py
import re from django.http import HttpResponse from django.shortcuts import render def home(request): return render(request, 'home.html', dic) def music(request): return render(request, 'music.html') def sport(request): return render(request, 'sport.html')
urls.py
from django.contrib import admin from django.urls import path from . import views urlpatterns = [ path('admin/', admin.site.urls), path('home/', views.home), path('music/', views.music), path('sport/', views.sport), ]
學(xué)到這里,大家又可以小激動一下了,一個靜態(tài)網(wǎng)頁的基本架構(gòu)慢慢成熟起來,將一個主頁應(yīng)用到其他頁面,同時又保持其他頁面的差異,django的模板思想越來越清晰了。
到此這篇關(guān)于Django模板層過濾器和繼承的文章就介紹到這了,更多相關(guān)Django模板層過濾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Python實現(xiàn)一個簡單的銀行轉(zhuǎn)賬操作
這篇文章主要介紹了基于Python實現(xiàn)一個簡單的銀行轉(zhuǎn)賬操作的相關(guān)資料,需要的朋友可以參考下2016-03-03Python實現(xiàn)計算兩個指定日期相差幾年幾月幾日
這篇文章主要為大家詳細(xì)介紹了如何使用Python實現(xiàn)計算兩個日期之間相差多少年,多少月,多少天,文中的的示例代碼講解詳細(xì),需要的可以參考下2024-02-02python與mysql數(shù)據(jù)庫交互的實現(xiàn)
這篇文章主要介紹了python與mysql數(shù)據(jù)庫交互的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01Python 測試框架unittest和pytest的優(yōu)劣
這篇文章主要介紹了Python 測試框架unittest和pytest的優(yōu)劣,幫助大家更好的進行python程序的測試,感興趣的朋友可以了解下2020-09-09Python利用Beautiful Soup模塊創(chuàng)建對象詳解
這篇文章主要介紹了Python利用Beautiful Soup模塊創(chuàng)建對象的相關(guān)資料,文中介紹的非常詳細(xì),相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03Python列表list解析操作示例【整數(shù)操作、字符操作、矩陣操作】
這篇文章主要介紹了Python列表list解析操作,結(jié)合實例形式分析了Python列表針對整數(shù)、字符及矩陣的解析操作實現(xiàn)技巧,需要的朋友可以參考下2017-07-07