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

Django 模板(Template)

1. 模板简介

作为 Web 开发框架,Django 提供了模板,可以很便利的动态生成 HTML。模版系统致力于表达外观,而不是程序逻辑。

模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视图可以使用任意一个模板,一个模板可以供多个视图使用。

模板包含:

  • HTML的静态内容
  • 动态插入的内容(Django 模板语言,简写 DTL,定义在 django.template 包中)

由 startproject 命令生成的 settings.py 定义关于模板的值:

  • DIRS 定义了一个目录列表,模板引擎按列表顺序搜索这些目录以查找模板源文件。
  • APP_DIRS 告诉模板引擎是否应该在每个已安装的应用中查找模板。

方式一(常用方式):在项目的根目录下创建 templates 目录,配置 DIRS 值。

DIRS = [os.path.join(BASE_DIR,"templates")]

方式二:在应用的目录下创建 templates 目录,则无需配置 DIRS 值,程序会自动在该目录下寻找模板。

模板处理

Django 处理模板分为两个阶段:

  • Step1 加载:根据给定的标识找到模板然后预处理,通常会将它编译好放在内存中
loader.get_template(template_name)  # 返回一个Template对象
  • Step2 渲染:使用Context数据对模板插值并返回生成的字符串
Template对象的render(RequestContext)方法,使用context渲染模板
  • 加载渲染完整代码:

from django.template import loader, RequestContext
from django.http import HttpResponsedef index(request):tem = loader.get_template('temtest/index.html')context = RequestContext(request, {})return HttpResponse(tem.render(context))

快捷函数

为了减少加载模板、渲染模板的重复代码,Django 提供了快捷函数:

  • render_to_string("")
  • render(request, '模板', context)
from django.shortcuts import renderdef index(request):return render(request, 'temtest/index.html')

  

2. 模板语言 DTL

模板语言包括:

  • 变量  {{ 变量名 }}
  • 标签  { % 代码块 % }
  • 过滤器
  • 注释  {# 代码或html #}

变量

语法:

{{ variable }}
  • 当模版引擎遇到一个变量,将计算这个变量,然后将结果输出。
  • 变量名只能由字母、数字、下划线(不能以下划线开头)和点组成。
  • 当模版引擎遇到点("."),会按照下列顺序查询:
    1. 字典查询,例如:foo["bar"]
    2. 属性或方法查询,例如:foo.bar
    3. 数字索引查询,例如:foo[bar]
  • 如果变量不存在, 模版系统将插入空字符串。
  • 在模板中调用方法时不能传递参数。
范例:在模板中调用对象的方法
  • 在 models.py 中定义类 HeroInfo 类:
from django.db import modelsclass HeroInfo(models.Model):...def showName(self):return self.hname
  • 在 views.py 中传递 HeroInfo 对象:

from django.shortcuts import render
from models import *def index(request):hero = HeroInfo(hname='abc')context = {'hero': hero}return render(request, 'temtest/detail.html', context)

  • 在模板 detail.html 中调用对象的方法:
{{hero.showName}}

标签

语法:

{% 代码块 %}

作用:

  • 在输出中创建文本
  • 控制循环或逻辑
  • 加载外部信息到模板,供以后的变量使用

for 标签

语法:

{% for ... in ... %}
# 循环体中的逻辑
{{forloop.counter}}  # 表示当前是第几次循环(从1开始)
{% empty %}
# 给出的列表为空或列表不存在时,执行此处。类似于 else
{% endfor %}  # for 循环的结束标识

示例:

<body>
{% for hero_obj in hero %}{{ forloop.counter }}: {{hero_obj.show}}<br/>
{% empty %}<h2>啥也没找到...</h2>
{% endfor %}
</body>1: 郭靖
2: 黄蓉
3: 比伯
4: 王嘉尔
5: 欧阳锋

if 标签

语法&#

http://www.dtcms.com/a/273805.html

相关文章:

  • 你会用Github Copilot 吗 ——《内置功能详解》
  • h2数据库数据文件备份(防止异常断电导致的数据库文件无法使用,元数据块损坏等问题)
  • Oracle RAC 11.2.0.4 更新SYSASM和SYS密码
  • Oracle字符类型详解:VARCHAR、VARCHAR2与CHAR的区别
  • 在 Spring Boot 中优化长轮询(Long Polling)连接频繁建立销毁问题
  • 基于Springboot+UniApp+Ai实现模拟面试小工具二:后端项目搭建
  • 鸿蒙app 开发中的 map 映射方式和用法
  • Deepseek-如何从零开始开发需要专业知识的prompt
  • 从零实现一个GPT 【React + Express】--- 【4】实现文生图的功能
  • [特殊字符] 扫描式处理:Python 自动提取 PDF 中关键词相关表格并导出为 Excel
  • Ubuntu 22.04与24.04 LTS版本对比分析及2025年使用建议
  • 嵌入式学习笔记--MCU阶段--day03中断
  • sqli-labs靶场通关笔记:第5-6关 报错注入
  • Android原生TabLayout使用技巧
  • DNS(Domain Name System,域名系统)
  • 11. TCP 滑动窗口、拥塞控制是什么,有什么区别
  • 正义的算法迷宫—人工智能重构司法体系的技术悖论与文明试炼
  • KeyError: “No object named ‘MambaIRv2Model‘ found in ‘model‘ registry!“
  • iOS 数组如何设计线程安全
  • netdxf—— CAD c#二次开发之(netDxf 处理 DXF 文件)
  • Rail开发日志_3
  • uniapp+unipush推送配置
  • 阿里云MaxCompute SQL与Apache Hive区别面面观
  • 开疆智能EtherCAT转CANopen网关连接台达伺服驱动器配置案例
  • 大模型及agent开发6 OpenAI Assistant API 高阶应用 - 流式输出功能
  • SEQUENCE在RAC多实例开启CACHE的NEXTVAL数值乱序问题
  • redis数据结构和数据类型
  • Redis实战案例
  • Java 面试题超详细解析(二)
  • Windows下的redis