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 变量使用

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

复制代码
<p>用户名: {{ user.username }}</p>
<p>第一个朋友: {{ friends.0.name }}</p>
<p>当前时间: {{ now }}</p>

2.2 常用内置过滤器

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

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

常用日期格式化字符

字符 描述 示例
Y 4位年份 2023
m 2位月份 01-12
d 2位日期 01-31
H 24小时制 00-23
i 分钟 00-59
s 00-59
2.2.4 安全相关
过滤器 描述 示例
safe 禁用HTML转义 `{``{ html_content
escape 转义HTML `{``{ user_input
striptags 去除HTML标签 `{``{ "text"

三、模板标签

3.1 控制流标签

3.1.1 for循环
复制代码
<ul>
{% for user in user_list %}
    <li>{{ forloop.counter }}. {{ user.name }}</li>
{% empty %}
    <li>暂无用户</li>
{% endfor %}
</ul>

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 %}

支持的运算符

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

  • 逻辑:and, or, not

  • 成员:in, not in

  • 同一性:is, is not

3.2 其他常用标签

3.2.1 with创建局部变量
复制代码
{% with total=products|length %}
  产品总数: {{ total }}
{% endwith %}
3.2.2 csrf_token跨站请求保护
复制代码
<form method="post">
  {% csrf_token %}
  <!-- 表单内容 -->
</form>
3.2.3 url反向解析URL
复制代码
<a href="{% url 'app_name:view_name' arg1 arg2 %}">链接</a>
3.2.4 include包含其他模板
复制代码
{% include "header.html" %}

四、模板继承与组件化

4.1 模板继承

基础模板(base.html):

复制代码
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}默认标题{% endblock %}</title>
    {% block css %}{% endblock %}
</head>
<body>
    {% block content %}
    <!-- 默认内容 -->
    {% endblock %}
    {% block js %}{% endblock %}
</body>
</html>

子模板(child.html):

复制代码
{% extends "base.html" %}

{% block title %}子页面标题{% endblock %}

{% block css %}
<link rel="stylesheet" href="style.css">
{% endblock %}

{% block content %}
<h1>这是子页面内容</h1>
{% endblock %}

4.2 静态文件处理

复制代码
{% load static %}

<!-- 图片 -->
<img src="{% static 'images/logo.png' %}" alt="Logo">

<!-- CSS -->
<link rel="stylesheet" href="{% static 'css/style.css' %}">

<!-- JavaScript -->
<script src="{% static 'js/app.js' %}"></script>

高级用法

复制代码
{% load static %}
{% get_static_prefix as STATIC_PREFIX %}

<img src="{{ STATIC_PREFIX }}images/icon.png">

五、自定义标签和过滤器

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}"

  3. 在模板中使用:

    {% load my_filters %}

    {{ "spaced text"|cut:" " }}
    {{ "price"|add_str:"" }}

相关推荐
~央千澈~11 分钟前
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
数据库·mongodb
Java初学者小白1 小时前
秋招Day18 - MyBatis - 基础
java·数据库·mybatis
工业甲酰苯胺1 小时前
Django集成Swagger全指南:两种实现方案详解
python·django·sqlite
ALLSectorSorft2 小时前
教务管理系统学排课教务系统模块设计
数据库·sql·oracle
小云数据库服务专线2 小时前
GaussDB 数据库架构师(八) 等待事件概述-1
数据库·数据库架构·gaussdb
是Yu欸4 小时前
【浏览器插件冲突】Edge浏览器加载不出来CSDN创作者中心
java·数据库·edge
安卓开发者4 小时前
Android Room 持久化库:简化数据库操作
android·数据库
极简之美4 小时前
spring boot h2数据库无法链接问题
数据库·spring boot·oracle
SelectDB6 小时前
浩瀚深度:从 ClickHouse 到 Doris,支撑单表 13PB、534 万亿行的超大规模数据分析场景
大数据·数据库·apache
SelectDB6 小时前
公开免费!Apache Doris & SelectDB 培训与认证课程正式上线
大数据·数据库·apache