詳解Django模板層過濾器和繼承的問題
過濾器
模板層對變量的操作實際還有很多,過濾器就是其中一種。學過Linux系統的一定知道管道操作符,其可以將上一步輸出直接作為下一步輸入進行處理,這裡的過濾器就是類似管道符,其寫法也是以管道符|
為標志,允許我們對模板層獲得的變量進行改變,例如大小寫轉換、增減大小等等
語法
{{ 變量|過濾器1|過濾器2:’值’ |…}}
這裡的過濾器可以分為兩類,一類是不帶參數的,例如lower,upper,safe
;一類是帶參數的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轉義,適用直接執行js代碼,理解為代碼安全可以直接執行 </body>
如果不適用safe
則輸出原始字符串,不會執行js代碼
除瞭以上過濾器,更多過濾器請參見https://docs.djangoproject.com/zh-hans/3.2/ref/templates/builtins
繼承
對於某個網站來說,一般又比較統一的風格,例如無論點擊網頁哪個標簽或者鏈接,導航欄和尾部都是基本一樣的內容,真正變的是中間的內容區域,如何才能讓不同的網頁有相同也有差異呢,django中對模板可以使用繼承的概念。
例如,有如下頁面,由三部分組成,第一塊是導航欄,無論哪個子頁面均是一樣,中間body區會因為點擊導航欄不同項目發生變化,而最後一塊尾部每個頁面都是一樣,如何實現上述要求呢?
- 求同:Django模板層通過
{% extends 'home.html' %}
實現子頁面對home.html的繼承,也就是說隻需要在每個子頁面寫上該行代碼即能完成對父頁面的繼承,但是需要註意的是不能繼承父頁面的相關視圖函數的變量 - 存異:在父頁面(home.html)中使用
{% block block_name %}...{% endblock block_name(可選) %}
標記塊,凡是在標記塊中的內容在子頁面都可以被修改,修改方法是在{% block block_name %}子頁面重寫內容{% endblock block_name(可選) %}
塊中重新更改內容即可
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> <!-- 導航欄,每個頁面都一樣 --> <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>歡迎來到主頁!(該部分區域因頁面而異)</h2> {% endblock %} <h3>如有問題請請聯系[email protected](每個頁面都一樣)</h3> </body> </html>
music.html
{% extends 'home.html' %} <!-- 修改body區域內容 --> {% block body %} <h2>歡迎來到音樂頻道!</h2> {% endblock %}
sport.html
{% extends 'home.html' %} <!-- 修改body區域內容 --> {% 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), ]
學到這裡,大傢又可以小激動一下瞭,一個靜態網頁的基本架構慢慢成熟起來,將一個主頁應用到其他頁面,同時又保持其他頁面的差異,django的模板思想越來越清晰瞭。
到此這篇關於Django模板層過濾器和繼承的文章就介紹到這瞭,更多相關Django模板層過濾器內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Django模板過濾器和繼承示例詳解
- 利用Python創建第一個Django框架程序
- python jinja2模板的使用示例
- Django路由層如何獲取正確的url
- Python Django框架介紹之模板標簽及模板的繼承