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

Django 模板变量与标签实战指南:90% 的 Django 新手都忽略了这几个细节

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集

很多刚学习 Django 的开发者都会产生一个错觉:

模板层只是 HTML + {{变量}}

实际上,在真实项目中,模板层承担着大量工作:

  • 页面逻辑控制
  • 数据循环渲染
  • 表单状态保持
  • 组件复用

如果没有理解 Django 模板机制,很容易写出难维护甚至错误的页面逻辑

这篇文章我们系统梳理 Django 模板层最核心的内容。

一、Django 模板层在 MTV 架构中的作用

Django 使用MTV 架构

  • Model:数据层
  • Template:视图展示层
  • View:业务逻辑层

请求流程如下:

简单理解:

View 负责数据处理 Template 负责页面渲染

两者之间通过变量字典进行通信

二、View 如何向 Template 传递变量

Django 最常见写法:

def index(request): context = { "name": "Tom", "age": 18 } return render(request, "index.html", context)

render 函数结构:

render(request, template_name, context)

第三个参数context是一个字典。

模板中可以通过:

{{ name }}

访问数据

三、Django 模板支持哪些数据结构

Django 模板可以接收绝大多数 Python 对象

1 字符串 2 整数 3 list 4 tuple 5 字典 6 函数 7 类实例对象 8 QuerySet

示例:

def test(request): data = { "name": "Tom", "age": 20, "hobby": ["coding", "game"], "info": {"city": "Beijing"}, "func": test_func } return render(request, "test.html", data)

注意一点:

如果传递函数

正确:

"func": test_func

错误:

"func": test_func()

后者传递的是函数执行结果

四、模板变量调用规则(重点)

模板中变量语法:

{{ variable }}

示例:

<p>{{ name }}</p> <p>{{ age }}</p>

Django 模板点查找规则

Django 使用统一的点查找机制

{{ object.attribute }}

查找顺序:

1 字典 key 2 对象属性 3 方法调用 4 列表索引

例如:

data = { "user": user, "list": ["A", "B"] }

模板:

{{ user.name }} {{ list.0 }}

模板方法调用规则

模板可以调用方法:

{{ user.get_full_name }}

但 Django 模板只允许调用无参数方法

这是出于安全性设计

五、Django 模板标签语法

模板标签用于逻辑控制

语法:

{% 标签 %}

结束标签:

{% end标签 %}

示例:

{% if %} {% endif %}

六、if 标签详解

基本语法:

{% if age > 18 %} 成年人 {% else %} 未成年 {% endif %}

支持的操作符:

  • ==

  • !=

  • <

  • =

  • <=

  • and

  • or

  • not

注意:

Django 模板不支持复杂括号表达式

七、for 标签与 empty 用法

循环结构:

{% for item in list %} {{ item }} {% endfor %}

empty 标签

当列表为空时:

{% for item in list %} {{ item }} {% empty %} 暂无数据 {% endfor %}

这个设计比 Python 更方便。

八、forloop 内置变量详解

for 循环中 Django 提供一个特殊变量:

forloop

常用属性:

变量含义
forloop.counter从1开始
forloop.counter0从0开始
forloop.revcounter倒序索引
forloop.first是否第一次
forloop.last是否最后一次

示例:

{% for name in names %} {{ forloop.counter }} {{ name }} {% endfor %}

九、实战案例:Django 计算器

页面结构:

  • 输入数字A
  • 运算符选择
  • 输入数字B
  • 点击计算

流程如下:

View 代码

def mycal(request): result = None n1 = None n2 = None op = None if request.method == "POST": n1 = request.POST.get("n1") n2 = request.POST.get("n2") op = request.POST.get("op") try: n1 = int(n1) n2 = int(n2) if op == "+": result = n1 + n2 elif op == "-": result = n1 - n2 except: result = "输入错误" return render(request, "cal.html", locals())

locals() 会把函数中的变量打包成字典。

十、表单状态保持

当页面刷新时,用户的选择容易丢失。

可以这样写:

<option value="+" {% if op == "+" %} selected {% endif %}> + </option>

这样提交后仍然保持用户选择。

十一、Django 模板重要补充知识

这里补充三个很多教程不会讲的关键点。

1 模板过滤器

过滤器用于处理变量。

语法:

{{ value | filter }}

示例:

{{ name | upper }}

常用过滤器:

过滤器作用
upper大写
lower小写
length长度
default默认值

示例:

{{ username|default:"匿名用户" }}

2 模板自动转义

Django 默认开启XSS 防护

示例:

<script>alert(1)</script>

模板输出:

&lt;script&gt;

如果需要关闭:

{{ content|safe }}

3 模板继承

大型项目都会使用模板继承:

{% extends "base.html" %}

然后定义块:

{% block content %} 页面内容 {% endblock %}

这样可以实现统一页面布局管理

结语

Django 模板系统虽然语法简单,但设计非常成熟。

核心能力包括:

1 变量传递 2 模板逻辑控制 3 数据循环 4 页面状态保持 5 模板继承与组件化

理解这些机制后,你会发现:

Django 模板不仅是 HTML 模板,而是一个完整的视图渲染系统

关于我们

霍格沃兹测试开发学社,隶属于测吧(北京)科技有限公司,是一个面向软件测试爱好者的技术交流社区。

学社围绕现代软件测试工程体系展开,内容涵盖软件测试入门、自动化测试、性能测试、接口测试、测试开发、全栈测试,以及人工智能测试与 AI 在测试工程中的应用实践

我们关注测试工程能力的系统化建设,包括 Python 自动化测试、Java 自动化测试、Web 与 App 自动化、持续集成与质量体系建设,同时探索 AI 驱动的测试设计、用例生成、自动化执行与质量分析方法,沉淀可复用、可落地的测试开发工程经验。

在技术社区与工程实践之外,学社还参与测试工程人才培养体系建设,面向高校提供测试实训平台与实践支持,组织开展“火焰杯” 软件测试相关技术赛事,并探索以能力为导向的人才培养模式,包括高校学员先学习、就业后付款的实践路径。

同时,学社结合真实行业需求,为在职测试工程师与高潜学员提供名企大厂 1v1 私教服务,用于个性化能力提升与工程实践指导。

http://www.cnnetsun.cn/news/1487604.html

相关文章:

  • 广州做跨境电商:现在入局还能盈利吗?行业现状与实操路径
  • YOLOv13官版镜像快速上手:5分钟搭建离线目标检测环境
  • 提示系统插件生态建设:提示工程架构师的独特见解与创新实践案例
  • SDMatte在数字藏品制作中应用:非遗纹样/水墨画透明底NFT生成
  • Tuna:超越show-o2,为多模态大模型构建“完美”的级联统一视觉编码器
  • Stable Diffusion开源生态:Pixel Fashion Atelier与Civitai LoRA生态的无缝集成方案
  • AI报告审核驱动质量升级:IACheck助力动力系统检测报告稳步提升
  • gte-base-zh实战入门必看:3步完成Xinference本地部署与API调用
  • 动态生成展示:LiuJuan20260223Zimage模型根据实时天气创作“风晴雨雪”主题画
  • OpenClaw+Qwen3.5-4B-Claude:智能家居控制中心自动化
  • 别再把 Polkadot 当成“又一条公链“ | 理解共享基础设施才是正确的打开方式
  • 手把手教你用NotaGen:小白也能一键生成贝多芬风格钢琴曲
  • OpenClaw浏览器自动化:Qwen3-VL:30B爬取图文数据到Notion
  • C#内存管理
  • 2026年6月PMP考试:70天倒计时,这5件事现在不做就晚了
  • vLLM-v0.17.1GPU算力适配:华为昇腾CANN 7.0与vLLM对接可行性验证
  • AI手势识别能否长期稳定运行?压力测试结果公布
  • 造相-Z-Image-Turbo亚洲美女LoRA:历史记录功能怎么用?建立个人素材库
  • NaViL-9B部署教程:适配双卡GPU的开源多模态大模型实战
  • SUPER COLORIZER 数据库集成实践:MySQL管理海量图像处理任务与结果
  • 如何快速获取百度网盘直链下载地址:终极免费提速指南
  • openclaw完全指南
  • Degrees of Lewdity中文本地化终极指南:从零开始畅玩完整汉化版
  • 2026.3.25笔记C#
  • 14 年 Java 老码农,重启 CSDN:从 2012 到 2026,我的技术成长与重启之路
  • Chord服务扩展教程:Qwen2.5-VL接入自定义OCR模块实现图文联合定位
  • 飞书文档自动化备份:如何通过3层架构设计实现企业级文档迁移方案
  • 零基础玩转Sonic数字人:ComfyUI工作流快速生成虚拟主播视频
  • ChatGPT免费使用2025实战指南:从API接入到生产环境部署
  • 模拟OJ1 2 3