Django 5实用指南(五)模板系统
Django5的模板系统是其核心功能之一,允许开发者将动态数据嵌入到HTML模板中,并根据不同的业务需求渲染页面。Django模板系统基于 Django模板语言(DTL),它提供了一些强大的功能,如模板标签、过滤器、条件语句和循环等,帮助开发者灵活地渲染和控制页面内容。
本章将详细介绍 Django5 的模板语言、模板标签、过滤器及其自定义,帮助您深入理解如何在 Django 中使用模板系统。
5.1 Django5模板语言概述
Django 模板语言(DTL)是一种简单、易学的语言,能够有效地将动态内容注入到静态HTML中。Django模板的基本结构包括以下几个部分:
- 模板变量:用于显示动态数据。
- 模板标签:控制模板的逻辑(如条件语句、循环等)。
- 模板过滤器:用于修改变量的输出内容。
5.2 模板变量
模板变量用 {{ }} 包裹,通常来自于视图传递的数据。你可以在视图函数中传递数据到模板,然后使用模板变量将数据展示出来。
5.2.1 模板变量示例
假设你有一个 User 模型,并想显示用户的名字和邮箱。
视图函数:
from django.shortcuts import render
from .models import Userdef user_profile(request, user_id):user = User.objects.get(id=user_id)return render(request, 'user_profile.html', {'user': user})
模板:
<!DOCTYPE html>
<html><head><title>{{ user.username }}'s Profile</title></head><body><h1>Welcome, {{ user.username }}!</h1><p>Email: {{ user.email }}</p></body>
</html>
在这个例子中,{{ user.username }} 和 {{ user.email }} 是模板变量,模板引擎会将它们替换为 user 对象中的 username 和 email 字段的值。
5.3 模板标签
模板标签用于实现更复杂的功能,如条件判断、循环等。标签使用 {% %} 包裹。常用的模板标签包括 if、for、block 等。
5.3.1 条件语句(if 标签)
if 标签用于根据条件执行不同的代码块。在模板中,if 标签用于判断条件是否成立,如果成立则执行相应的代码。
条件语句示例:
{% if user.is_authenticated %}<p>Welcome back, {{ user.username }}!</p>
{% else %}<p>Please log in to access your profile.</p>
{% endif %}
在这个示例中,Django会检查 user.is_authenticated 是否为 True,如果是,则显示欢迎信息,否则提示用户登录。
5.3.2 循环语句(for 标签)
for 标签用于循环遍历一个序列(如列表、字典等)。在模板中,常用的 for 标签用于遍历列表或查询集。
循环语句示例:
<ul>{% for post in posts %}<li>{{ post.title }} - {{ post.created_at }}</li>{% empty %}<li>No posts available.</li>{% endfor %}
</ul>
在这个例子中,{% for post in posts %} 遍历 posts 列表中的每个 post 对象,显示文章的标题和创建时间。如果列表为空,则显示 No posts available。
5.3.3 引入模板(include 标签)
include 标签允许在一个模板中嵌入另一个模板,通常用于重复的页面结构,如头部、脚部等。
引入模板示例:
{% include 'header.html' %}<h1>{{ title }}</h1>
{% include 'footer.html' %}
在这个例子中,header.html 和 footer.html 是独立的模板文件,include 标签将它们嵌入到当前模板中。
5.4 模板过滤器
模板过滤器用于修改变量的显示方式。它们在模板变量后面用 | 分隔。例如,{{ value|lower }} 会将 value 变量转换为小写字母。
5.4.1 常见过滤器
date:格式化日期
<p>Published on: {{ post.created_at|date:"Y-m-d" }}</p>
default:如果变量为空,则使用默认值
<p>{{ user.bio|default:"This user has not updated their bio." }}</p>
length:返回一个列表或字符串的长度
<p>Number of posts: {{ posts|length }}</p>
lower:将字符串转换为小写
<p>{{ user.username|lower }}</p>
join:将列表元素连接成一个字符串
<p>{{ tags|join:", " }}</p>
5.4.2 自定义过滤器
Django 允许开发者创建自定义过滤器,以便在模板中使用。
自定义过滤器示例:
- 创建过滤器:
在 templatetags 目录下创建一个 custom_filters.py 文件:
from django import templateregister = template.Library()@register.filter
def add_suffix(value, suffix):return f"{value}{suffix}"
加载并使用过滤器:
在模板中使用自定义过滤器之前,首先需要加载该过滤器:
{% load custom_filters %}<p>{{ user.username|add_suffix:"_profile" }}</p>
在这个例子中,add_suffix 过滤器会将用户的用户名添加一个后缀 "_profile"。
5.5 模板继承与块(Block)
模板继承是 Django 模板系统的一个重要特性,它允许你创建一个基本的“框架”模板,并在子模板中插入特定内容。
5.5.1 基本模板(父模板)
父模板定义了网页的基本结构,如头部、导航栏、脚本等。使用 {% block %} 标签定义可以被子模板覆盖的部分。
父模板(base.html):
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>{% block title %}My Website{% endblock %}</title></head><body><header><h1>Welcome to My Website</h1></header><nav><a href="/">Home</a> | <a href="/about">About</a></nav><main>{% block content %}Default content{% endblock %}</main><footer><p>© 2023 My Website</p></footer></body>
</html>
5.5.2 子模板
子模板继承自父模板,并覆盖其中的块部分。
子模板(home.html):
{% extends 'base.html' %}{% block title %}Home - My Website{% endblock %}{% block content %}<h2>Welcome to the home page!</h2><p>This is where the content goes.</p>{% endblock %}
通过 {% extends %} 和 {% block %} 标签,子模板可以继承父模板的结构,并定制其内容。
5.6 模板的性能优化
在 Django 项目中,模板渲染的性能非常重要,尤其是在高流量的 Web 应用中。以下是一些优化模板性能的方法:
缓存模板:使用 Django 的模板缓存机制,减少重复渲染的开销。
{% load cache %}{% cache 600 sidebar %}<!-- 这里是需要缓存的内容 -->{% endcache %}
避免过多的循环和条件判断:尽量避免在模板中进行复杂的计算和大量的循环。
静态文件和媒体文件的优化:确保在模板中使用 static 标签来引用静态文件,并设置适当的缓存策略。
小结
本章深入介绍了 Django5 中的模板系统,包括模板变量、模板标签、过滤器的使用,以及如何自定义过滤器。我们还讲解了模板继承和块的概念,使得在大型项目中复用模板变得更加容易。通过有效的模板管理,Django5 提供了一个灵活、强大的系统来动态渲染和展示数据。
相关文章:
Django 5实用指南(五)模板系统
Django5的模板系统是其核心功能之一,允许开发者将动态数据嵌入到HTML模板中,并根据不同的业务需求渲染页面。Django模板系统基于 Django模板语言(DTL),它提供了一些强大的功能,如模板标签、过滤器、条件语句…...
游戏引擎学习第114天
打开内容并回顾 目前正在讨论一个非常重要的话题——优化。当代码运行太慢,无法达到所需性能时,我们该怎么办。昨天,我们通过在代码中添加性能计数器,验证了一些性能分析的数据,这些计数器帮助我们了解每个操作需要的…...
Python 赋能 AI:从零实现图像分类
人工智能(AI)热度持续攀升,而 Python 作为 AI 开发的利器,以其简洁易学、生态丰富的特点,成为众多开发者的首选。本文以图像分类为例,带你用 Python 实现一个简单的 AI 模型。 1. 环境准备 首先,我们需要安装一些必要的 Python 库: pip install tensorflow keras nu…...
UE引擎游戏加固方案解析
据VGinsights的报告,近年来UE引擎在过去几年中市场占比显著增长,其中亚洲市场增幅达到了30%,随着UE5的推出和技术的不断进步,UE引擎在独立开发者和移动游戏开发中的应用也在逐步增加。 UE引擎的优势在于强大的画面表现与视觉特效…...
Http升级为Https - 开发/测试服环境
1.应用场景 主要用于开发/测试服环境将http升级为https, 防止前端web(浏览器)出现Mixed Content报错; 2.学习/操作 1.文档阅读 deepseek 问答; 2.整理输出 报错信息: Mixed Content: The page at <URL> was loaded over HTTPS, but requested an insecure XMLHttpRequ…...
SaaS系统租户隔离方案分析:基于域名与请求头的比较
在设计SaaS系统时,租户隔离是非常重要的设计考虑因素。租户隔离的方式决定了系统的可扩展性、安全性和维护性。常见的租户隔离方案包括基于域名和基于**请求头(header)**的隔离方式。每种方式都有其优缺点,具体选择应根据系统的需…...
调用click.getchar()时Windows PyCharm无法模拟键盘输入
文章目录 问题描述解决方案参考文献 问题描述 调用 click.getchar() 时,Windows PyCharm 无法模拟键盘输入 解决方案 Run → Edit Configurations… → Modify options → Emulate terminal in output console 参考文献 Terminal emulator | PyCharm Documentati…...
科普:“docker”与“docker compose”
一、安装Docker Desktop 安装Docker Desktop,则既安装了Docker,也安装了Docker Compose 从Docker Desktop官方下载页面(https://www.docker.com/products/docker-desktop/),选择适合Windows系统的版本进行下载安装。 验证: do…...
Windows 快速搭建C++开发环境,安装C++、CMake、QT、Visual Studio、Setup Factory
安装C 简介 Windows 版的 GCC 有三个选择: CygwinMinGWmingw-w64 Cygwin、MinGW 和 mingw-w64 都是在 Windows 操作系统上运行的工具集,用于在 Windows 环境下进行开发和编译。 Cygwin 是一个在 Windows 上运行的开源项目,旨在提供类Uni…...
【分布式理论12】事务协调者高可用:分布式选举算法
文章目录 一、分布式系统中事务协调的问题二、分布式选举算法1. Bully算法2. Raft算法3. ZAB算法 三、小结与比较 一、分布式系统中事务协调的问题 在分布式系统中,常常有多个节点(应用)共同处理不同的事务和资源。前文 【分布式理论9】分布式…...
GPT2 模型训练
GPT2 预训练模型 基座 专门供给别人使用的。 对中文分词是一个字一个字分,是Bert的分类方法 好处:灵活。 词库可以适应任何文章。 坏处:训练的难度更大。需要增加数据量 中文分词如果按词组分词 好处:需要的数据量小&#…...
蓝桥杯备考:递归初阶
什么是递归? 相信我们已经不陌生了,函数自己调用自己就叫递归 为什么要有递归? 当处理主问题时,遇到子问题,子问题的解决方法和主问题是一样的,这时候我们就要用到递归 解决流程:问题—》相…...
[C语言]指针进阶压轴题
下面代码打印结果是什么? #include<stdio.h> int main() {char* c[] { "ENTER","NEW","POINT","FIRST" };char** cp[] { c 3,c 2,c 1,c };char*** cpp cp;printf("%s\n", **cpp);printf("%s\n…...
YOLOv11-ultralytics-8.3.67部分代码阅读笔记-build.py
build.py ultralytics\data\build.py 目录 build.py 1.所需的库和模块 2.class InfiniteDataLoader(dataloader.DataLoader): 3.class _RepeatSampler: 4.def seed_worker(worker_id): 5.def build_yolo_dataset(cfg, img_path, batch, data, mode"train"…...
智能体(AI Agent、Deepseek、硅基流动)落地实践Demo——借助大模型生成报表,推动AI赋能企业决策
文章目录 一、 引言二、 系统设计与技术细节2.1 系统架构2.2 核心组件说明 三、 Demo 代码推荐博客: 四、输出年度营销报告1. 总销售额 根据提供的数据,年度总销售额为:740.0。2. 各产品销售额3. 各地区销售额4. 各产品在各地区的销售情况 分…...
mac os设置jdk版本
打开环境变量配置文件 sudo vim ~/.bash_profile 设置不同的jdk版本路径 # 设置JAVA_HOME为jdk17路径 export JAVA_HOME$(/usr/libexec/java_home -v 17)# 设置JAVA_HOME为jdk8路径 export JAVA_HOME$(/usr/libexec/java_home -v 1.8) 设置环境变量 # 将jdk加入到环境变量…...
Llama 3.1 本地电脑部署 Linux系统 【轻松简易】
本文分享在自己的本地电脑部署 llama3.1,而且轻松简易,快速上手。 这里借助Ollama工具,在Linux系统中进行大模型部署~ Llama3.1,有三个版本:8B、70B、405B Llama 3.1 405B 是第一个公开可用的模型,在常识…...
计算机网络安全之一:网络安全概述
1.1 网络安全的内涵 随着计算机和网络技术的迅猛发展和广泛普及,越来越多的企业将经营的各种业务建立在Internet/Intranet环境中。于是,支持E-mail、文件共享、即时消息传送的消息和协作服务器成为当今商业社会中的极重要的IT基础设施。然而࿰…...
docker 部署JAR
docker pull openjdk:23 使用Docker运行生成的JAR包是一个将应用程序容器化的好方法,它确保了你的应用可以在任何安装了Docker的环境中以相同的方式运行。以下是创建一个Docker镜像并运行包含你Java应用程序的JAR包的基本步骤。1. 准备 Dockerfile首先,在…...
深研究:与Dify建立研究自动化应用
许多个人和团队面临筛选各种网页或内部文档的挑战,以全面概述一个主题。那么在这里我推荐大家使用Dify,它是一个用于LLM应用程序开发的低代码,开源平台,它通过自动化工作流程的多步搜索和有效汇总来解决此问题,仅需要最小的编码。 在本文中,我们将创建“ Deepresearch”…...
第1章:LangChain4j的聊天与语言模型
LangChain4J官方文档翻译与解析 目标文档路径: https://docs.langchain4j.dev/tutorials/chat-and-language-models/ 语言模型的两种API类型 LangChain4j支持两种语言模型(LLM)的API: LanguageModel:这种API非常简单,…...
IPv6报头40字节具体怎么分配的?
目录 IPv6报头结构 字段详解 示例代码:IPv6报头的Python实现 输出示例 IPv6协议是为了解决IPv4地址耗尽问题而设计的下一代互联网协议。与IPv4相比,IPv6不仅提供了更大的地址空间,还简化了报头结构,提高了网络设备的处理效率。…...
Ubuntu ARM / aarch64 CPU 镜像下载:如何在 ARM 设备上安装和使用 Ubuntu
随着 ARM 架构的逐渐普及,尤其是在移动设备和高效能计算设备中的应用,许多开发者和用户开始关注基于 ARM 架构的操作系统。Ubuntu 作为一款广泛使用的 Linux 发行版,自然也为 ARM 架构提供了优化的版本。本文将详细介绍如何下载适用于 ARM / …...
图论入门算法:拓扑排序(C++)
上文中我们了解了图的遍历(DFS/BFS), 本节我们来学习拓扑排序. 在图论中, 拓扑排序(Topological Sorting)是对一个有向无环图(Directed Acyclic Graph, DAG)的所有顶点进行排序的一种算法, 使得如果存在一条从顶点 u 到顶点 v 的有向边 (u, v) , 那么在排序后的序列中, u 一定…...
MySQL中count(1)和count(*) 的区别
MySQL中count(1)和count(*) 的区别 在 MySQL 中,COUNT(1) 和 COUNT(*) 均用于统计查询结果中的行数,但它们在语义及其背后的机制上有一些区别。 基本功能 COUNT(*):统计表中所有行的数量,无论列是否为 NULL。 COUNT(1)…...
Android 14输入系统架构分析:图解源码从驱动层到应用层的完整传递链路
一、资料快车 1、深入了解Android输入系统:https://blog.csdn.net/innost/article/details/47660387 2、书籍 - Android系统源代码情景分析 二、Perface 1、参考: 2、系统程序分析方法 1)加入log,并跟着log一步步分析 -logc…...
Web入侵实战分析-常见web攻击类应急处置实验2
场景说明 某天运维人员,发现运维的公司站点被黑页,首页标题被篡改,你获得的信息如下: 操作系统:windows server 2008 R2业务:公司官网网站架构:通过phpstudy运行apache mysqlphp开放端口&…...
Jenkins 配置 Credentials 凭证
Jenkins 配置 Credentials 凭证 一、创建凭证 Dashboard -> Manage Jenkins -> Manage Credentials 在 Domain 列随便点击一个 (global) 二、添加 凭证 点击左侧 Add Credentials 四、填写凭证 Kind:凭证类型 Username with password: 配置 用…...
Android Http-server 本地 web 服务
时间:2025年2月16日 地点:深圳.前海湾 需求 我们都知道 webview 可加载 URI,他有自己的协议 scheme: content:// 标识数据由 Content Provider 管理file:// 本地文件 http:// 网络资源 特别的,如果你想直接…...
selenium爬取苏宁易购平台某产品的评论
目录 selenium的介绍 1、 selenium是什么? 2、selenium的工作原理 3、如何使用selenium? webdriver浏览器驱动设置 关键步骤 代码 运行结果 注意事项 selenium的介绍 1、 selenium是什么? 用于Web应用程序测试的工具。可以驱动浏览…...
Linux中POSIX应用场景
Linux 提供了丰富的 POSIX(Portable Operating System Interface)标准接口,这些接口可以帮助开发者编写可移植、高效的应用程序。POSIX 标准定义了一系列系统调用和库函数,涵盖了文件操作、进程管理、线程管理、信号处理、同步机制…...
Boringssl介绍
BoringSSL 是 Google 从 OpenSSL 分支出来的一个开源 TLS/SSL 库,旨在为 Google 的产品和服务提供一个更加轻量、安全和现代化的加密库。它是 OpenSSL 的一个替代品,专注于简化代码、提高安全性和减少潜在的攻击面。 以下是对 BoringSSL 的详细介绍&…...
react实例与总结(二)
目录 一、脚手架基础语法(16~17) 1.1、hello react 1.2、组件样式隔离(样式模块化) 1.3、react插件 二、React Router v5 2.1、react-router-dom相关API 2.1.1、内置组件 2.1.1.1、BrowserRouter 2.1.1.2、HashRouter 2.1.1.3、Route 2.1.1.4、Redirect 2.1.1.5、L…...
僵尸进程、孤儿进程
一、僵尸进程、孤儿进程 僵尸进程、孤儿进程 1、僵尸进程: (1)定义:子进程死了(内存、打开的文件等都释放了),但没有完全死(数据结构<包含进程ID,进程状态、运行时…...
快速入门Springboot+vue——MybatisPlus多表查询及分页查询
学习自哔哩哔哩上的“刘老师教编程”,具体学习的网站为:7.MybatisPlus多表查询及分页查询_哔哩哔哩_bilibili,以下是看课后做的笔记,仅供参考。 多表查询 多表查询[Mybatis中的]:实现复杂关系映射,可以使…...
redis解决高并发看门狗策略
当一个业务执行时间超过自己设定的锁释放时间,那么会导致有其他线程进入,从而抢到同一个票,所有需要使用看门狗策略,其实就是开一个守护线程,让守护线程去监控key,如果到时间了还未结束,就会将这个key重新s…...
深入解析 MySQL 8 C++ 源码:二级索引回表操作
在数据库系统中,索引是优化查询性能的关键技术之一。MySQL 的 InnoDB 存储引擎支持多种索引类型,其中二级索引(非聚簇索引)和聚簇索引(主键索引)是最常见的两种。然而,由于二级索引的叶子节点只…...
MySQL如何解决幻读?
目录 一、什么是幻读? 1.1 幻读的定义 1.2 幻读的示例 1.3 幻读产生的原因? 1.4?读已提交(Read Committed) 1.4.1 确定事务等级 1.4.2 非锁定读取 准备 示例 结论 1.4.3 锁定读取 准备 示例 分析 结论 1.5?可重…...
RabbitMQ的脑裂(网络分区)问题
问题描述: Mnesia reports that this RabbitMQ cluster has experienced a network partition. There is a risk of losing data 一、什么是MQ脑裂? 网络分区 如果另一个节点在一段时间内(默认为 60 秒)无法与其联系࿰…...
【网络安全 | 漏洞挖掘】价值$40000:从路径遍历升级至RCE
未经许可,不得转载。 文章目录 路径遍历RCE路径遍历 在进行目标侦查和端口扫描时,我发现了一个使用 8443 端口的子域名:http://admin.target.com:8443。许多人可能会忽略返回 404 的子域名,但我并没有。 对 http://admin.target.com:8443/FUZZ 进行模糊测试时,我发现了一…...
程函方程的详细推导
以下是基于非均匀介质弹性波方程(无纵波假设)推导程函方程的详细过程,完整考虑纵波(P 波)和横波(S 波)的耦合效应:...
AD(Altium Designer)三种方法导入图片
目录 1、脚本方式导入图片 1.1 准备脚本文件和导入图片 1.2 运行脚本 1.3 导入文件 1.4 选中文件 2.5 运行 2.6 导入图片 2.7 选择图片 2.8 转换 2.9 退出 2.10 联合 2.11 确认 2.12 调整大小 2.13 复制 2.14 粘贴 2、图片直接导入图片 2.1点击放置 2.2 图片…...
fpga助教面试题
第一题 module sfp_pwm( input wire clk, //clk is 200M input wire rst_n, input wire clk_10M_i, input wire PPS_i, output reg pwm ) reg [6:0] cunt ;always (posedge clk ) beginif(!rst_n)cunt<0;else if(cunt19) //200M是10M的20倍cunt<0;elsecunt<cunt1;…...
问题记录汇总
记录一些问题 如何分析错误帧问题-CSDN博客...
安全问答—安全的基本架构
前言 将一些安全相关的问答进行整理汇总和陈述,形成一些以问答呈现的东西,加入一些自己的理解,欢迎路过的各位大佬进行讨论和论述。很多内容都会从甲方的安全认知去进行阐述。 1.安全存在的目的? 为了支持组织的目标、使命和宗…...
玩客云 IP查找
1.玩客云使用静态IP在不同网段路由器下不能使用,动态不好找IP地址 1.1使用python3 实现自动获取发送 import requests import os import socket# 从环境变量获取 PushPlus 的 token 和群组编码 PUSH_PLUS_TOKEN os.getenv("PUSH_PLUS_TOKEN") PUSH_PLU…...
鸿蒙与跨端迁移的重要性
鸿蒙操作系统(HarmonyOS)是由华为公司开发的一款面向未来的全场景分布式操作系统。它旨在提供一个统一的平台,支持各种设备之间的无缝协作和数据共享,从而为用户提供更加连贯和高效的体验。在鸿蒙的生态系统中,跨端迁移…...
MATLAB学习之旅:从入门到基础实践
在当今科技飞速发展的时代,MATLAB作为一款强大的数学软件,犹如一把神奇的钥匙,能够打开众多领域的大门。无论是工程计算、数据分析,还是算法开发、可视化呈现,MATLAB都展现出了无与伦比的魅力。今天,就让我们踏上这段奇妙的MATLAB学习之旅,从最基础的部分开始,逐步探索…...
【队列】循环队列(Circular Queue)详解
文章目录 一、循环队列简介二、循环队列的判空和判满三、循环队列的实现leetcode 622. 设计循环队列 一、循环队列简介 在实际开发中,队列是一种常用的数据结构,而循环队列(Circular Queue)则一般是一种基于数组实现的队列&#x…...
Spring-GPT智谱清言AI项目(附源码)
一、项目介绍 本项目是Spring AI第三方调用整合智谱请言(官网是:https://open.bigmodel.cn)的案例,回答响应流式输出显示,这里使用的是免费模型,需要其他模型可以去 https://www.bigmodel.cn/pricing 切换…...