当前位置: 首页 > ai >正文

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

支持的运算符

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

  • 逻辑:andornot

  • 成员:innot in

  • 同一性:isis 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 templateregister = 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:" " }}  <!-- 输出: "spacedtext" -->
{{ "price"|add_str:"$" }}    <!-- 输出: "price$" -->

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:

<ul>
{% for item in items %}<li>项目 {{ item }}</li>
{% endfor %}
</ul>

模板中使用:

{% 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页面,同时保持代码的整洁和可扩展性。

http://www.xdnf.cn/news/15885.html

相关文章:

  • Oracle 数据库共享池与大池调优指南
  • RuoYi配置多数据源失效
  • 【烧脑算法】拓扑排序:从“依赖”到“序列”,理解题目中的先后逻辑
  • 虚拟电厂蓄势:源网荷储联动如何实现电力系统的 “智慧蝶变”?
  • 如何升级到macOS Tahoe:全面指南与实用步骤
  • 从一开始的网络攻防(六):php反序列化
  • 关于JavaWeb的总结笔记
  • 云原生周刊:K8s 中的后量子密码学
  • 【学习路线】C#企业级开发之路:从基础语法到云原生应用
  • docker 容器学习
  • zabbix企业级分布式监控环境部署
  • 【Prometheus+Grafana篇】监控通过Keepalived实现的MySQL HA高可用架构
  • 在翻译语义相似度和会议摘要相似度评估任务中 ,分类任务 回归任务 生成任务区别
  • 布局AI +文化新赛道,浙江省文化产业投资集团赴景联文科技调研交流
  • uniapp【uni-ui】【vue3】样式覆盖方式记录
  • Git上传与下载GitHub仓库
  • Neo4j 5.x版本的导出与导入数据库
  • 【系统全面】Linux内核原理——基础知识介绍
  • Python-数据库概念-pymysql-元编程-SQLAlchemy-学习笔记
  • 【ASP.NET Core】ASP.NET Core中Redis分布式缓存的应用
  • Python day20 - 特征降维之奇异值分解
  • 隧道代理的动态IP切换机制与实现原理
  • 农村供水智慧化管理系统:从精准监测到智能调度,破解农村用水安全与效率难题
  • 康复器材动静态性能测试台:精准检测,为康复器械安全保驾护航
  • Gradio项目部署到魔搭创空间
  • 开发避坑短篇(3):解决@vitejs plugin-vue@5.0.5对Vite^5.0.0的依赖冲突
  • [特殊字符] Java反射从入门到飞升:手撕类结构,动态解析一切![特殊字符]
  • Dockerfile 完全指南:从入门到精通
  • Three.js 全景图(Equirectangular Texture)教程:从加载到球面映射
  • AR技术:石化行业培训的“游戏规则改变者”