6.2 模板标签与过滤器
Django6模板标签与过滤器完整教程 - 从基础到自定义开发
本教程详细讲解Django6中的模板标签和过滤器,涵盖常用标签如if、for、include、extends的使用方法,以及如何开发与注册自定义标签和过滤器,适合Django初学者系统学习模板技术。
Django6模板标签与过滤器教程
引言
Django的模板系统是生成动态HTML的核心组件,模板标签和过滤器是实现动态功能的关键工具。标签用于执行逻辑操作(如条件判断、循环),而过滤器用于格式化数据(如日期、字符串处理)。本教程将带你从基础到进阶,掌握Django6中的模板标签和过滤器。
常用模板标签
模板标签在Django模板中用{% ... %}表示,用于嵌入逻辑控制。以下是一些常用标签的详细说明。
if标签
if标签用于条件判断,支持if、elif和else分支。
语法:
{% if condition %}
<!-- 当condition为真时显示的内容 -->
{% elif another_condition %}
<!-- 其他条件 -->
{% else %}
<!-- 所有条件为假时显示的内容 -->
{% endif %}
示例:
假设有一个用户对象user,判断用户是否已登录。
{% if user.is_authenticated %}
<p>欢迎回来,{{ user.username }}!</p>
{% else %}
<p>请先<a href="/login/">登录</a>。</p>
{% endif %}
for标签
for标签用于循环遍历列表、字典或查询集,可配合empty子句处理空情况。
语法:
{% for item in list %}
<!-- 循环体,item为当前元素 -->
{% empty %}
<!-- 如果list为空时显示的内容 -->
{% endfor %}
示例:
遍历一个产品列表products。
<ul>
{% for product in products %}
<li>{{ product.name }} - 价格: {{ product.price }}</li>
{% empty %}
<li>暂无产品。</li>
{% endfor %}
</ul>
include标签
include标签用于包含其他模板文件,便于复用代码片段。
语法:
{% include "template_name.html" %}
示例:
假设有header.html和footer.html文件。
<!DOCTYPE html>
<html>
<body>
{% include "header.html" %}
<main>这里是主要内容。</main>
{% include "footer.html" %}
</body>
</html>
extends标签
extends标签用于模板继承,允许子模板扩展父模板的结构,常配合block标签使用。
语法:
{% extends "base_template.html" %}
示例:
父模板base.html定义基本框架。
<!-- base.html -->
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}默认标题{% endblock %}</title>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
子模板home.html继承并覆盖部分内容。
{% extends "base.html" %}
{% block title %}首页 - 我的网站{% endblock %}
{% block content %}
<h1>欢迎来到首页!</h1>
<p>这里是子模板的具体内容。</p>
{% endblock %}
自定义模板标签开发与注册
自定义模板标签允许你创建特定功能的标签,扩展Django模板能力。
开发步骤
- 创建templatetags目录:在Django应用目录下新建一个名为
templatetags的文件夹,并添加__init__.py文件(可以是空文件)。 - 编写标签代码:在
templatetags目录中创建一个Python文件,如my_tags.py,并定义标签函数。 - 注册标签:使用
@register.simple_tag或@register.tag装饰器注册标签。
示例代码
假设我们要创建一个简单标签,显示当前时间。
在my_tags.py中:
from django import template
import datetime
register = template.Library()
@register.simple_tag
def current_time(format_string):
"""返回格式化后的当前时间。"""
return datetime.datetime.now().strftime(format_string)
在模板中使用:
{% load my_tags %}
<p>当前时间是:{% current_time "%Y-%m-%d %H:%M:%S" %}</p>
高级标签注册
使用@register.tag装饰器创建复杂标签,需要解析参数。示例:创建一个标签输出问候语。
from django import template
register = template.Library()
@register.simple_tag
def greet_user(username):
return f"Hello, {username}!"
在模板中:{% greet_user "Alice" %} 输出 "Hello, Alice!"
常用模板过滤器
模板过滤器用于格式化变量值,语法为{{ value|filter }}。以下是一些常用过滤器的介绍。
date过滤器
date过滤器格式化日期对象,支持多种格式字符串。
语法:
{{ value|date:"format_string" }}
示例: 格式化文章的发布日期。
<p>发布日期:{{ article.published_at|date:"Y年m月d日" }}</p>
length过滤器
length过滤器获取字符串、列表或字典的长度。
语法:
{{ value|length }}
示例: 检查列表中的元素数量。
<p>您有 {{ items|length }} 个待办事项。</p>
default过滤器
default过滤器为变量提供默认值,当变量为空或未定义时使用。
语法:
{{ value|default:"默认值" }}
示例: 处理用户邮箱为空的情况。
<p>邮箱:{{ user.email|default:"未提供" }}</p>
其他常用过滤器
lower:将字符串转换为小写,例如{{ "HELLO"|lower }}输出 "hello"。upper:将字符串转换为大写,例如{{ "hello"|upper }}输出 "HELLO"。truncatechars:截断字符串到指定长度,例如{{ "This is a long text"|truncatechars:10 }}输出 "This is a..."。
自定义模板过滤器开发与注册
自定义过滤器允许你创建数据格式化函数,步骤类似于自定义标签。
开发步骤
- 创建templatetags目录(如果已有则跳过)。
- 编写过滤器代码:在
templatetags目录中创建一个文件,如my_filters.py。 - 注册过滤器:使用
@register.filter装饰器。
示例代码
假设创建一个过滤器,为字符串添加后缀。
在my_filters.py中:
from django import template
register = template.Library()
@register.filter
def add_suffix(value, suffix):
"""为字符串添加后缀。"""
return f"{value}{suffix}"
在模板中使用:
{% load my_filters %}
<p>{{ "欢迎"|add_suffix:",用户!" }}</p>
高级过滤器示例
创建一个过滤器进行乘法运算。
@register.filter
def multiply(value, arg):
try:
return float(value) * float(arg)
except (ValueError, TypeError):
return value # 如果转换失败,返回原值
在模板中:{{ 5|multiply:2 }} 输出 10.0。
总结
模板标签和过滤器是Django模板系统的强大工具,使你能在模板中轻松实现逻辑控制和数据格式化。常用标签如if、for、include、extends覆盖了基础需求,而自定义功能提供了扩展性。开发自定义标签和过滤器时,遵循Django的注册机制,保持代码简洁和可维护。通过实践,你将能高效构建动态网页内容。
最佳实践建议:
- 尽量使用内置标签和过滤器,避免过度自定义以保持模板简洁。
- 在自定义功能中,确保错误处理,如使用
try-except避免模板渲染失败。 - 利用模板继承和包含来促进代码复用,提高开发效率。