Django 6中文教程

6.2 模板标签与过滤器

Django6模板标签与过滤器完整教程 - 从基础到自定义开发

Django 6中文教程

本教程详细讲解Django6中的模板标签和过滤器,涵盖常用标签如if、for、include、extends的使用方法,以及如何开发与注册自定义标签和过滤器,适合Django初学者系统学习模板技术。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Django6模板标签与过滤器教程

引言

Django的模板系统是生成动态HTML的核心组件,模板标签和过滤器是实现动态功能的关键工具。标签用于执行逻辑操作(如条件判断、循环),而过滤器用于格式化数据(如日期、字符串处理)。本教程将带你从基础到进阶,掌握Django6中的模板标签和过滤器。

常用模板标签

模板标签在Django模板中用{% ... %}表示,用于嵌入逻辑控制。以下是一些常用标签的详细说明。

if标签

if标签用于条件判断,支持ifelifelse分支。

语法:

{% 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.htmlfooter.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模板能力。

开发步骤

  1. 创建templatetags目录:在Django应用目录下新建一个名为templatetags的文件夹,并添加__init__.py文件(可以是空文件)。
  2. 编写标签代码:在templatetags目录中创建一个Python文件,如my_tags.py,并定义标签函数。
  3. 注册标签:使用@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..."。

自定义模板过滤器开发与注册

自定义过滤器允许你创建数据格式化函数,步骤类似于自定义标签。

开发步骤

  1. 创建templatetags目录(如果已有则跳过)。
  2. 编写过滤器代码:在templatetags目录中创建一个文件,如my_filters.py
  3. 注册过滤器:使用@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模板系统的强大工具,使你能在模板中轻松实现逻辑控制和数据格式化。常用标签如ifforincludeextends覆盖了基础需求,而自定义功能提供了扩展性。开发自定义标签和过滤器时,遵循Django的注册机制,保持代码简洁和可维护。通过实践,你将能高效构建动态网页内容。

最佳实践建议:

  • 尽量使用内置标签和过滤器,避免过度自定义以保持模板简洁。
  • 在自定义功能中,确保错误处理,如使用try-except避免模板渲染失败。
  • 利用模板继承和包含来促进代码复用,提高开发效率。
开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包