实用指南:Django模板系统

一、Django模板系统基础

1.1 模板系统简介

Django模板系统是Django框架中用于生成动态HTML的核心组件,它实现了业务逻辑(Python代码)与展示逻辑(HTML)的分离。模板系统基于简单的文本格式,使用特殊的语法标记动态内容。

核心特点

  • 变量替换:使用{{ variable }}语法

  • 逻辑控制:使用{% tag %}语法

  • 可扩展性:支持自定义标签和过滤器

  • 继承机制:支持模板继承,减少重复代码

1.2 基本语法规则

Django模板语言使用两种特殊符号:

  1. 变量{{ variable }}

    • 用于显示变量值

    • 示例:{{ user.name }}

  2. 标签{% tag %}

    • 用于执行逻辑控制

    • 示例:{% for item in list %}

重要规则

  • 点号(.)有特殊含义,查找顺序:

    1. 字典查找(dict.key

    2. 属性查找(object.attribute

    3. 方法调用(object.method()

    4. 列表索引(list.0

  • 如果变量不存在,模板系统会插入空字符串而非报错

  • 模板中调用方法时不能传递参数

二、模板变量与过滤器

2.1 变量使用

变量可以来自视图函数传递的上下文,也可以是模板中的临时变量。

用户名: {{ user.username }}
第一个朋友: {{ friends.0.name }}
当前时间: {{ now }}

2.2 常用内置过滤器

过滤器用于在显示前对变量进行修改,语法为{{ variable|filter:arg }}

2.2.1 基础过滤器
过滤器描述示例
default变量为False或空时使用默认值{{ value|default:"nothing" }}
length返回值的长度{{ list|length }}
filesizeformat格式化文件大小{{ 1024|filesizeformat }} → "1 KB"
slice切片操作{{ "hello"|slice:"2:4" }} → "ll"
2.2.2 字符串处理
过滤器描述示例
lower转换为小写{{ "HELLO"|lower }} → "hello"
upper转换为大写{{ "hello"|upper }} → "HELLO"
truncatechars截断字符{{ "long text"|truncatechars:5 }} → "lon..."
truncatewords截断单词{{ "long sentence"|truncatewords:1 }} → "long..."
cut移除指定字符{{ "spaced"|cut:" " }} → "spaced"
join连接列表{{ list|join:", " }}
2.2.3 日期时间处理
{{ post.pub_date|date:"Y-m-d H:i:s" }}
{{ user.last_login|timeuntil }}
{{ event.start_time|timesince:event.end_time }}

常用日期格式化字符

字符描述示例
Y4位年份2023
m2位月份01-12
d2位日期01-31
H24小时制00-23
i分钟00-59
s00-59
2.2.4 安全相关
过滤器描述示例
safe禁用HTML转义{{ html_content|safe }}
escape转义HTML{{ user_input|escape }}
striptags去除HTML标签{{ "<b>text</b>"|striptags }} → "text"

三、模板标签

3.1 控制流标签

3.1.1 for循环
{% for user in user_list %}
{{ forloop.counter }}. {{ user.name }}
{% empty %}
暂无用户
{% endfor %}

forloop变量属性

属性描述
counter当前循环次数(从1开始)
counter0当前循环次数(从0开始)
revcounter反向循环次数(从1开始)
revcounter0反向循环次数(从0开始)
first是否为第一次循环
last是否为最后一次循环
parentloop外层循环对象
3.1.2 if条件判断
{% if user_list %}
用户数: {{ user_list|length }}
{% elif black_list %}
黑名单数: {{ black_list|length }}
{% else %}
没有用户数据
{% endif %}

支持的运算符

  • 比较:==!=<><=>=

  • 逻辑:andornot

  • 成员:innot in

  • 同一性:isis not

3.2 其他常用标签

3.2.1 with创建局部变量
{% with total=products|length %}
产品总数: {{ total }}
{% endwith %}
3.2.2 csrf_token跨站请求保护
{% csrf_token %}
3.2.3 url反向解析URL
链接
3.2.4 include包含其他模板
{% include "header.html" %}

四、模板继承与组件化

4.1 模板继承

基础模板(base.html):

{% block title %}默认标题{% endblock %}
{% block css %}{% endblock %}
{% block content %}
{% endblock %}
{% block js %}{% endblock %}

子模板(child.html):

{% extends "base.html" %}
{% block title %}子页面标题{% endblock %}
{% block css %}
{% endblock %}
{% block content %}
这是子页面内容
{% endblock %}

4.2 静态文件处理

{% load static %}

高级用法

{% load static %}
{% get_static_prefix as STATIC_PREFIX %}

五、自定义标签和过滤器

5.1 创建自定义过滤器

  1. 在app目录下创建templatetags目录和__init__.py文件

  2. 创建过滤器文件,如my_filters.py:

from django import template
register = template.Library()
@register.filter(name='cut')
def cut(value, arg):
"""移除字符串中的所有指定字符"""
return value.replace(arg, '')
@register.filter
def add_str(value, arg):
"""添加后缀"""
return f"{value}{arg}"
  1. 在模板中使用:

{% load my_filters %}
{{ "spaced text"|cut:" " }}
{{ "price"|add_str:"$" }}

5.2 创建自定义标签

5.2.1 Simple Tag
@register.simple_tag
def current_time(format_string):
return datetime.datetime.now().strftime(format_string)

模板中使用:

{% current_time "%Y-%m-%d %H:%M:%S" %}
5.2.2 Inclusion Tag
@register.inclusion_tag('result.html')
def show_results(n):
n = max(1, int(n))
return {'items': range(1, n+1)}

result.html:

{% for item in items %}
项目 {{ item }}
{% endfor %}

模板中使用:

{% show_results 5 %}

六、最佳实践与常见问题

6.1 最佳实践

  1. 模板组织

    • 将模板按功能模块划分

    • 公共部分提取为基模板

    • 重复部分提取为组件

  2. 性能优化

    • 避免在模板中进行复杂计算

    • 使用{% with %}缓存频繁访问的变量

    • 合理使用{% include %}

  3. 安全性

    • 对用户输入内容使用escapestriptags

    • 谨慎使用safe过滤器

    • 所有POST表单包含{% csrf_token %}

6.2 常见问题

  1. 变量查找失败

    • 检查变量名拼写

    • 确认视图函数是否正确传递了变量

    • 使用default过滤器提供默认值

  2. 模板继承问题

    • 确保{% extends %}是模板的第一个标签

    • 检查基模板路径是否正确

    • 确认所有必要的{% block %}都已定义

  3. 静态文件加载失败

    • 确认STATIC_URL设置正确

    • 检查文件是否在STATICFILES_DIRS目录中

    • 确保{% load static %}在文件顶部

通过掌握这些Django模板系统的知识,您将能够高效地构建动态、可维护的Web页面,同时保持代码的整洁和可扩展性。

posted @ 2025-08-18 21:19  yjbjingcha  阅读(27)  评论(0)    收藏  举报