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 允许开发者创建自定义过滤器,以便在模板中使用。

自定义过滤器示例:

  1. 创建过滤器:

在 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 提供了一个灵活、强大的系统来动态渲染和展示数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/70452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app开发app时 使用uni.chooseLocation遇到的问题

问题一&#xff1a;不显示 问题二&#xff1a;选择地址列表一直在加载中 因为 uni-app 接口文档 中已经说明&#xff0c;使用腾讯的话需要开启云服务&#xff0c;具体可看官网&#xff0c;这就是为什么使用时直接不显示的原因&#xff0c;所以我使用的高德&#xff0c;但又出现…

推荐系统-排序模型

本次学习的重点是FM系列和WideNDeep系列。其实这两个模型是存在因果关系的。从最初的LR模型开始&#xff0c;因为缺失高效的特征交互方式&#xff0c;产生了FM模型&#xff0c;即通过向量内积代替特征之间的两两交互的参数。最后DNN的引入可以建模更高阶的特征。但是DNN如何与F…

体验用ai做了个python小游戏

体验用ai做了个python小游戏 写在前面使用的工具2.增加功能1.要求增加视频作为背景。2.我让增加了一个欢迎页面。3.我发现中文显示有问题。4.我提出了背景修改意见&#xff0c;欢迎页面和结束页面背景是视频&#xff0c;游戏页面背景是静态图片。5.提出增加更多游戏元素。 总结…

c#爬取数据并解析json

安装 Newtonsoft.Json Install-Package Newtonsoft.Json代码 HttpClient client new HttpClient();// 获取网页内容HttpResponseMessage response client.GetAsync("https://opentdb.com/api.php?amount10&category18&difficultyeasy&typemultiple"…

计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【分布式理论13】分布式存储:数据存储难题与解决之道

文章目录 一、数据存储面临的问题二、RAID磁盘阵列的解决方案1. RAID概述2. RAID使用的技术3. RAID的代表性等级 三、分布式存储的新思路1. 分布式存储背景与特点2. 分布式存储的组成要素 一、数据存储面临的问题 在单机系统时代&#xff0c;当数据量不断增加、硬盘空间不够时…

高德地图android sdk(备忘)

依赖 // 权限请求框架&#xff1a;https://github.com/getActivity/XXPermissions implementation com.github.getActivity:XXPermissions:20.0 // https://mvnrepository.com/artifact/com.amap.api/navi-3dmap-location-search implementation com.amap.api:navi-3dmap-loca…

DeepSeek、微信、硅基流动、纳米搜索、秘塔搜索……十种不同方法实现DeepSeek使用自由

为了让大家实现 DeepSeek 使用自由&#xff0c;今天分享 10 个畅用 DeepSeek 的平台。 一、官方满血版&#xff1a;DeepSeek官网与APP 首推&#xff0c;肯定是 DeepSeek 的官网和 APP&#xff0c;可以使用满血版 R1 和 V3 模型&#xff0c;以及联网功能。 网址&#xff1a; htt…

自动化之ansible(二)

一、ansible中playbook&#xff08;剧本&#xff09; 官方文档&#xff1a; Ansible playbooks — Ansible Community Documentation 1、playbook的基本结构 一个基本的playbook由以下几个主要部分组成 hosts: 定义要执行任务的主机组或主机。 become: 是否需要使用超级用户…

python 神经网络教程,神经网络模型代码python,小白入门基础教程

文章目录 前言1. 神经网络基础概念1.1 神经元1.2 激活函数1.3 神经网络结构1.4 安装 Python1.5 选择开发环境2. 使用numpy构建简单神经网络 3. 使用PyTorch构建复杂神经网络 前言 本教程旨在为广大初学者和有一定基础的开发者提供一个系统、全面且深入的 Python 神经网络学习指…

SOME/IP--协议英文原文讲解10

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.2.2 Req…

Spring框架基本使用(Maven详解)

前言&#xff1a; 当我们创建项目的时候&#xff0c;第一步少不了搭建环境的相关准备工作。 那么如果想让我们的项目做起来方便快捷&#xff0c;应该引入更多的管理工具&#xff0c;帮我们管理。 Maven的出现帮我们大大解决了管理的难题&#xff01;&#xff01; Maven&#xf…

用大内存主机下载Visual Studio

用一台内存达到128G的主机下载Visual Studio 2022&#xff0c;用的是公司网络。下载速度让我吃了一惊&#xff0c;没人用网络了&#xff1f;还是网站提速了&#xff1f;以前最大只能达到5MB/秒。记录这段经历&#xff0c;是用来分析公司网络用的......

Ubuntu20.04.2安装Vmware tools

软件版本&#xff1a;Vmware Workstation Pro 17.6.2 操作系统镜像文件&#xff1a;ubuntu-20.04.2-desktop-amd64 方式1&#xff1a;用iso镜像安装 没用这种方法&#xff0c;太麻烦 方式2&#xff1a;用apt安装Open VM Tools 如果你使用的是较新的Ubuntu版本&#xff08;如…

Mac系统下使用Docker快速部署MaxKB:打造本地知识库问答系统

随着大语言模型的广泛应用&#xff0c;知识库问答系统逐渐成为提升工作效率和个人学习的有力工具。MaxKB是一款基于LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统&#xff0c;支持多模型对接、文档上传和自动爬取等功能。本文将详细介绍如何在Ma…

2526考研资料分享 百度网盘

通过网盘分享的文件&#xff1a;01、2026【考研数学】 链接: https://pan.baidu.com/s/1N-TlXcCKMcX1U-KBr0Oejg?pwducbe 提取码: ucbe 提取码:98wg--来自百度网盘超级会员v3的分享 通过网盘分享的文件&#xff1a;01、2026【考研政治】 链接: https://pan.baidu.com/s/1N-T…

【信息系统项目管理师-案例真题】2013下半年案例分析答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一【问题‍ 1】(12 分)【问题‍ 2】(10 分)【问题 3】( 3 分 )试题二【问题‍ 1】(3‍ 分)【问题‍ 2】(10‍ 分)【问题‍ 3】(3‍ 分)【问题‍ 4】(9‍ 分)试题三【问题‍ 1】(12‍ 分)‍【问题‍ 2】(8‍…

idea连接gitee(使用idea远程兼容gitee)

文章目录 先登录你的gitee拿到你的邮箱找到idea的设置选择密码方式登录填写你的邮箱和密码登录成功 先登录你的gitee拿到你的邮箱 具体位置在gitee–>设置–>邮箱管理 找到idea的设置 选择密码方式登录 填写你的邮箱和密码 登录成功

UNIAPP开发之利用阿里RTC服务实现音视频通话后端THINKPHP5

下面是一个使用ThinkPHP 5实现后端逻辑的示例。我们将创建一个简单的ThinkPHP 5项目来处理生成推流和播流地址的请求。 后端部分&#xff08;ThinkPHP 5&#xff09; 1. 初始化ThinkPHP 5项目 首先&#xff0c;确保你已经安装了Composer。然后使用Composer创建一个新的Think…

嵌入式开发岗位认识

目录 1.核心定义2.岗位方向3.行业方向4.技术方向5.工作职责6.核心技能7.等级标准8.优势与劣势9.市场薪资10. 发展路径11. 市场趋势12. 技术趋势 1.核心定义 嵌入式系统&#xff1a; 以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软硬件可裁剪的专用计算机系统 特点…