您好,登录后才能下订单哦!
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。