Django 模板引擎 (四)

一、Django模板引擎

         一个强大的工具,用于在HTML页面中嵌入动态内容。它使用一种被称为Django模板语言(Django Template Language)的简单而强大的语法来处理模板。该模板语言使用”{% %}”进行标记,用于执行各种操作。

二、Django 提供标准的API

    Django 定义了一个标准的API,用于加载和渲染模板,而不考虑后端。加载包括为给定的标识符找到模板并对其进行预处理,通常是将其编译成内存中的表示形式。渲染是指将上下文数据插入模板,并返回结果字符串。Django内置的模板引擎包含模板上下文(亦可称为模板变量)、标签过滤器。

   内置的模板标签可以在Django源码(\django\template\defaulttags.py)里找到定义过程,每个内置标签都有功能注释和使用方法

2.1 表达式

(1)表达式标记

Django模板语言提供了一些内置的表达式,用于在模板中执行算术、逻辑和字符串操作。

<p>{{ 10 - 8 }}</p>
<p>{{ name|lower }}</p>
<p>{{ "Hello, " + name }}</p>

show.html 

 <ul>{# 变量使用 #}<li>{{ name }} &nbsp;</li><li>{{ age }} &nbsp;</li><li>{{ hobbys }} &nbsp;</li><li>{{ hobbys.0 }} &nbsp;{{ hobbys.3 }}</li><li>{{ address }} &nbsp;</li><li>{{ address.hz }} &nbsp;{{ address.bj }}</li></ul>

 

(2)过滤器(本质为函数)

它对模板变量进行一系列的转换和处理。我们可以在变量后使用管道符“|”来应用过滤器。

比如模板上下文的内容截取、替换或格式转换等。过滤器转换变量和标签参数的值。

语法:变量|过滤器:“参数”

show.html 

    <h2>过滤器</h2>{#  {{ var|过滤器 }}#}{#    作用: 在变量显示前修改#}<p>age={{ age }}</p><p>age|add= {{ age|add:10 }}</p>{# add: +增加 or -减少 #}<p>age|add= {{ age|add:-10 }}</p> {# 控制数字的大小#}{#upper: 获取首字母的大写#}<p>name|first|upper= {{ name|first|upper }}</p>{#lower: 获取最后一个字母的小写#}<p>name|last|lower= {{ name|last|lower }}</p>{#title: 获取#}<p>name|title= {{ name|title}}</p>{#truncatechars: 获取截断字符串的个数,包含首不包含尾 #}<p>name|truncatechars= {{ name|truncatechars:4}}</p>

 view.py

def modata(request):data={'name':'liufang','age':68,}#返回数据return render(request,template_name='show.html',context=data)

  效果:

 

(3)标签

标签是Django模板语言中的特殊命令,用于执行一些额外的操作,例如加载静态文件、获取URL等。

    <a href="{% url 'baidu' %}">Baidu</a>

url路径 

视图函数


#重定向 -直接跳转到页面
def baidu(request):# return  redirect("https://www.runoob.com/django/django-orm-1.html")return  redirect("https://www.baidu.com/")

效果: 

(4) 继承

  它属于标签,它是将每个模板文件重复的代码抽取出来并写在一个共用的模板文件中,其他模板文件通过继承共用模板文件来实现完整的网页输出。

 (1) 父模版

如果发现在多个模板中某些内容相同,那就应该把这段内容定义到父模板中。
标签 block:用于在父模板中预留区域,留给子模板填充差异性的内容,名字不能相同。为了更好的可读性建议给 endblock标签写上名字,这个名字与对应的 block名字相同,父模板中也可以使用上下文中传递过来的数据。

#父模板
def father(request):return render(request,template_name='father.html')

 father.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>主页</title>{# css #}{% block extcss %}<style type="text/css">li {{#list-style: none;#}line-height: 30px;}</style>{% endblock %}
</head>
<body>
<div><h1>父模板页面</h1>{# 头部模块 #}{% block head %}{% endblock %}{# 主体模块 #}{% block content %}<div><button>父模板按钮</button></div>{% endblock %}{# 尾部模块 #}{% block foot %}{% endblock %}{# js #}{% block extjs %}{% endblock %}</div>
</body>
</html>

 (2) 子模版

标签 extends:继承,写在子模板文件的第一行 {% block名称 %}
预留区域,可以编写默认内容,也可以没有默认内容 {% endblock名称 %}
子模版不用填充父模版中的所有预留区域,如果子模版没有填充,则使用父模版定义的默认值 {% extends “父模板路径” %}

#子模板
def son(request):return render(request,template_name='son.html')

son.html

{# 继承父模板 #}
{% extends 'father.html' %}
{# 使用头部模块 #}
{% block head %}<div><h1>使用了头部模板</h1></div>
{% endblock %}{# 主体模块 #}
{# 默认情况下:子模板是会覆盖父模板的内容 #}
{# 如果想使用父模板不会覆盖,则需要使用:block.super #}{% block content %}{{ block.super }}  {#继承父模板#}<div><button>子模板按钮</button></div>
{% endblock %}{# 尾部模块 #}{% block foot %}{# 导入其他模块 #}{% include "son2.html" %}{% endblock %}

son2.html

<ol><li>MySQl</li><li>Oracle</li><li>DB2</li>
</ol>

2.2 控制流

 在Django模板中,”{% %}”标记可以用于控制模板的逻辑流程。

(1) If语句

    “{% if %}”标记用于根据条件来判断是否显示某个部分的内容。

较运算符:==、!=、<、>、<=、>=
布尔运算符:and、or、not
注意:运算符左右两侧不能紧挨着变量或常量,必须有空格

 show.html

 {# if标签-单支分支 #}{% if age < 18 %}<p>{{ name }} 未成年</p>{% endif %}{# if..else标签 #}{% if age < 18 %}<p>{{ name }} 未成年</p>{% else %}<p>{{ name }} 成年</p>{% endif %}{# if..elif...else标签-多支分支 #}{% if age < 18 %}<p>{{ name }} 未成年</p>{% elif age < 40  and age > 55 %}<p>{{ name }} 成年人</p>{% else %}<p>{{ name }} 老年人</p>{% endif %}

view.py 

#模板
def modata(request):data={'name':'liufang','age':68,'hobbys':['basketball','game','movie','read book'],'address':{'sz':'深圳','bj':'北京','hz':'杭州'},'stars':[['刘备','关羽','张飞'],['曹操','许诸','典韦'],['王昭君','貂蝉','西施','杨玉环'],]}#返回数据return render(request,template_name='show.html',context=data)

 

  注释

(1){#单行注释#}

        {% comment %}

(2)这里是多行注释

        {% endcomment %}

(2)For循环

  “{% for %}”标记用于在模板中迭代一个集合,并反复渲染相应的部分。迭代过程中,我们可以使用特殊的变量来引用当前迭代的元素

{{ forloop.counter }} 可以取出迭代对象的序号,如列表,字典;

show.html 

 {#for标签 #}{% for hobby in hobbys %}<p>{{ hobby }}</p>{% endfor %}{#嵌套循环for标签 #}<table border="1" width="20%">{% for star in stars %}<tr>{% for st in star %}<td>{{ st }}</td>{% endfor %}</tr>{% endfor %}</table>

 

(3)Include语句

    “{% include %}”标记用于在模板中包含其他模板的内容。这使得模板的组织更加模块化和可重用


 

四、总结:

     Django模板语言中的”{% %}”标记是控制逻辑流程和执行表达式的关键。它可以用于条件判断、循环迭代、包含其他模板、执行表达式和应用过滤器。通过合理地使用这些标记,我们可以轻松地在Django应用中生成动态的HTML页面。

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

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

相关文章

【论文精读】HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face

HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face 前言Abstract1 Introduction2 Related Works3 HuggingGPT3.1 Task PlanningSpecification-based InstructionDemonstration-based Parsing 3.2 Model SelectionIn-context Task-model Assignment 3…

测试需要写测试用例吗?(从不同角度下剖析问题)

前言 最近在网上看到关于这样的一个话题“测试需要写测试用例吗&#xff1f;”&#xff0c;引起了很多同学的讨论。这段话是这样的&#xff1a; 测试用例主要作用&#xff1a;有效地评估软件的质量&#xff0c;测试用例质量体现了测试的质量。 下面摘取一部分同学的观点&…

记录labelImg上手过程

一、安装 Labelimg&#xff08;目标检测标注工具&#xff09;安装_labelimg安装_向南不向北的博客-CSDN博客 二、打开 进入anaconda虚拟环境后&#xff0c;cd到labelimg文件夹&#xff0c;然后输入命令 python labelImg.py 三、基础设置 打标工具labelimg安装和使用教程-C…

【知识】稀疏矩阵是否比密集矩阵更高效?

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 问题提出 有些地方说&#xff0c;稀疏图比密集图的计算效率更高&#xff0c;真的吗&#xff1f; 原因猜想 这里的效率高&#xff0c;应该是有前提的&#xff1a;当使用稀疏矩阵的存储格式(如CSR)时&#xff0c;计…

酷狗音乐app 评论signature

文章目录 声明目标加密参数定位翻页逻辑代码实现 声明 本文章中所有内容仅供学习交流&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请私信我立即删除&#xff01; 目标 复制curl转python # -*- c…

供应链大事记 | 2024第二届中国供应链碳中和峰会来了!

背景 当下&#xff0c;全球气候变化、环境污染、资源紧张问题加剧&#xff0c;世界各国致力于推动碳达峰、碳中和&#xff0c;绿色低碳发展已成为全球共识。我国也于2020年明确提出“3060双碳目标”&#xff0c;经济结构、能源结构、产业结构亟待转型升级&#xff0c;各重点行…

熟悉SVN基本操作-(SVN相关介绍使用以及冲突解决)

一、SVN相关介绍 1、SVN是什么? 代码版本管理工具它能记住你每次的修改查看所有的修改记录恢复到任何历史版本恢复已经删除的文件 2、SVN跟Git比&#xff0c;有什么优势 使用简单&#xff0c;上手快目录级权限控制&#xff0c;企业安全必备子目录checkout&#xff0c;减少…

Git——工作区管理

如何管理工作目录&#xff0c;以便用户可以更高效地新建提交。如何在处理工作区和暂存区文件的过程中修复错误&#xff0c;以及如何修复最近一次提交记录中的问题&#xff1b;同时还会了解到如何安全地使用暂存机制和多个工作目录处理工作流中的中断问题。 主要内容有以下几点…

玻色量子研发进展

2023年 2023.8 量子计算突破云渲染资源调度&#xff01;真机测试完整报告公开&#xff01; 2023.8 量子计算突破金融信用评分&#xff01;真机测试完整报告公开&#xff01; 2023.7 玻色量子“揭秘”之旅行商问题与Ising建模 2023.7 玻色量子“揭秘”之背包问题与Ising建…

采集软件大全-全网免费的采集软件大全

采集软件大揭秘&#xff1a;从排名到任意网站采集的全方位解读 在数字时代&#xff0c;信息是黄金&#xff0c;而采集软件就是那把能够淘金的工具。无论是市场调研、竞品分析还是SEO优化&#xff0c;采集软件都扮演着不可或缺的角色。在这个领域里&#xff0c;有许多选择&…

性能测试线上监控

如果你的产品出现了一个线上问题&#xff0c;你会是怎么样的反应&#xff1f; 也许会跟下面这张图一样。 哇&#xff01;有一个线上bug&#xff0c;好慌呀&#xff01;&#xff01; 咦&#xff0c;问题似乎自动解决了&#xff1f;渐渐冷静。 不对&#xff01;&#xff01;&a…

虚拟机系列:Oracle VM VirtualBox安装/更新/卸载出现 无法访问你试图使用的功能所在的网络位置

Oracle VM VirtualBox安装/更新/卸载出现 无法访问你试图使用的功能所在的网络位置 Oracle VM VirtualBox安装/更新/卸载出现 无法访问你试图使用的功能所在的网络位置Oracle VM VirtualBox安装/更新/卸载出现 无法访问你试图使用的功能所在的网络位置 在更新Oracle VM Virtua…

【JavaEE初阶】 详解HTTPS协议加密过程

文章目录 &#x1f334;HTTPS协议是什么&#xff1f;&#x1f384;运营商劫持事件&#x1f38b;HTTPS的工作过程&#x1f6a9;对称加密&#x1f6a9;非对称加密&#x1f6a9;引入证书&#x1f6a9;完整流程 &#x1f333;HTTPS加密总结⭕总结 &#x1f334;HTTPS协议是什么&…

基于SSM校园驿站管理系统的设计与实现

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对校园快递信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

C语言——多种方式打印出1000之内的所有的“水仙花数”

所谓水仙花数,是指一个3位数,其各位数字立方和等于该数本身。水仙花数是指一个三位数&#xff0c;它的每个位上的数字的立方和等于它本身。例如&#xff0c;153是一个水仙花数&#xff0c;因为1^3 5^3 3^3 153。 方法一 #define _CRT_SECURE_NO_WARNINGS 1#include <std…

Docker自定义镜像

目录 回顾 镜像含义 DockerFile语法 自定义java项目镜像 创建一个空目录&#xff0c;在这个空目录中创建一个文件&#xff0c;命名为 DockerFile&#xff0c;将 java 项目打包成 jar 包&#xff0c;放到这个目录中 ​编辑 编写DockerFile文件信息 使用 docker build 构建…

分享86个简历竞聘PPT,总有一款适合您

分享86个简历竞聘PPT&#xff0c;总有一款适合您 86个简历竞聘PPT下载链接&#xff1a;https://pan.baidu.com/s/130iX0EIH6J-PFzb6HcntcQ?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整…

【追求卓越10】算法--跳表

引导 在上一节中&#xff0c;我们学习到二分查找&#xff0c;惊叹于它超高的效率&#xff08;时间复杂度为O(logn)&#xff09;。但是二分查找有一个局限性就是依赖于数组&#xff0c;这就导致它应用并不广泛。 那么适用链表是否可以做到呢&#xff1f;答案是可以的。只不过要复…

【程序员的自我修养03】深入了解ELF文件格式

绪论 大家好&#xff0c;欢迎来到【程序员的自我修养】专栏。正如其专栏名&#xff0c;本专栏主要分享学习《程序员的自我修养——链接、装载与库》的知识点以及结合自己的工作经验以及思考。编译原理相关知识本身就比较有难度&#xff0c;我会尽自己最大的努力&#xff0c;争取…

嵌入式Linux:ARM驱动+QT应用+OpenCV人脸识别项目实现

一、前言&#xff1a; 这个项目主要分为两部分&#xff0c;客户端&#xff08;ARM板端&#xff09;负责利用OpenCV采集人脸数据&#xff0c;利用TCP将人脸数据发送给服务器&#xff0c;然后服务器根据人脸数据进行人脸识别&#xff0c;将识别后的结果返还给客户端&#xff0c;客…