# Django模板過濾器和繼承示例分析
## 一、模板過濾器基礎概念
### 1.1 什么是模板過濾器
Django模板過濾器(Template Filters)是一種用于在模板中對變量進行處理的特殊語法。它們通過管道符(`|`)連接在變量后面,能夠在不修改原始數據的情況下改變變量的顯示方式。
```python
# 示例:基礎過濾器使用
{{ variable|lower }} # 將變量轉換為小寫
Django提供了60+個內置過濾器,主要分為以下幾類:
字符串處理:
upper
, lower
, title
truncatechars:30
(截斷字符)slugify
(生成URL友好字符串)數字格式化:
floatformat:2
(保留兩位小數)filesizeformat
(文件大小格式化)日期時間處理:
date:"Y-m-d"
time:"H:i"
列表/字典操作:
length
slice:":5"
dictsort:"name"
安全相關:
safe
(標記安全HTML)escape
(轉義HTML)多個過濾器可以通過鏈式調用實現復雜處理:
<!-- 先轉大寫,再取前3個字符 -->
{{ "hello"|upper|slice:":3" }} <!-- 輸出:HEL -->
配合if
標簽實現條件過濾:
{% if user_list|length > 5 %}
<p>用戶數量較多,共{{ user_list|length }}人</p>
{% endif %}
當內置過濾器不滿足需求時,可以創建自定義過濾器:
templatetags/
文件夾__init__.py
和自定義模塊文件(如my_filters.py
)# my_filters.py
from django import template
register = template.Library()
@register.filter(name='multiply')
def multiply(value, arg):
"""數值乘法過濾器"""
return float(value) * float(arg)
使用示例:
{% load my_filters %}
{{ 5|multiply:3 }} <!-- 輸出15 -->
Django模板繼承通過三個核心標簽實現:
- {% extends %}
:聲明繼承關系
- {% block %}
:定義可覆蓋的內容塊
- {% include %}
:嵌入子模板
基礎模板(base.html):
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}默認標題{% endblock %}</title>
</head>
<body>
{% block content %}
<p>這是默認內容</p>
{% endblock %}
</body>
</html>
子模板(child.html):
{% extends "base.html" %}
{% block title %}子頁面標題{% endblock %}
{% block content %}
{{ block.super }} <!-- 保留父模板內容 -->
<p>新增的子模板內容</p>
{% endblock %}
Django支持多級模板繼承,形成完整的模板層次結構:
base.html (全局基礎模板)
├── admin_base.html (管理后臺專用)
│ └── user_admin.html (用戶管理頁面)
└── front_base.html (前端站點專用)
└── product_page.html (產品詳情頁)
特性 | extends | include |
---|---|---|
主要用途 | 整體結構繼承 | 代碼片段復用 |
執行順序 | 優先處理 | 在解析位置即時包含 |
覆蓋能力 | 支持block覆蓋 | 不能覆蓋 |
適用場景 | 頁面框架布局 | 公共組件(如導航欄) |
結合過濾器和繼承實現產品展示頁:
base_template.html:
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}電商平臺{% endblock %}</title>
<style>
.price { color: red; font-weight: bold; }
</style>
</head>
<body>
{% include "navbar.html" %}
{% block content %}{% endblock %}
{% include "footer.html" %}
</body>
</html>
product_detail.html:
{% extends "base_template.html" %}
{% load humanize %}
{% block title %}{{ product.name }} - 商品詳情{% endblock %}
{% block content %}
<div class="product">
<h2>{{ product.name|title }}</h2>
<p class="price">
¥{{ product.price|floatformat:2|intcomma }}
</p>
<p>
上架時間:{{ product.created_at|date:"Y年m月d日" }}
</p>
<div>
{{ product.description|linebreaks|truncatewords_html:50 }}
</div>
</div>
{% endblock %}
過濾器緩存:
頻繁使用的復雜過濾結果可以通過with
標簽緩存:
{% with formatted_price=product.price|multiply:discount|floatformat:2 %}
<p>折扣價:{{ formatted_price }}</p>
<p>原價:{{ product.price|floatformat:2 }}</p>
{% endwith %}
繼承層級控制: 建議模板繼承不超過3層,過度嵌套會影響可維護性
靜態文件處理:
在基礎模板中使用static
模板標簽:
{% load static %}
<link rel="stylesheet" href="{% static 'css/main.css' %}">
|
default
過濾器測試){% load %}
標簽當多個block
出現沖突時:
- 子模板中的block會覆蓋父模板
- 使用{{ block.super }}
保留父級內容
- 相同名字的block以最后加載的模板為準
結合trans
和blocktrans
標簽實現多語言:
{% load i18n %}
{% blocktrans with price=product.price|floatformat:2 %}
當前價格: {{ price }}元
{% endblocktrans %}
Django的模板系統通過過濾器和繼承機制,實現了邏輯與表現的優雅分離。合理運用這些特性可以: - 減少代碼重復 - 提高可維護性 - 實現動態內容展示 建議開發者深入理解其工作原理,根據實際場景靈活組合使用,可以顯著提升開發效率。 “`
注:本文實際約1700字,包含了代碼示例、表格對比等結構化內容,符合技術文章的專業要求??筛鶕枰{整具體示例或補充更多應用場景。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。