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.hqwc.cn/news/245396.html

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

相关文章

Linux驱动开发学习笔记3《新字符设备驱动实验》

目录 一、新字符设备驱动原理 1.分配和释放设备号 2.新的字符设备注册方法 &#xff08;1&#xff09; 字符设备结构 &#xff08;2&#xff09;cdev_init函数 &#xff08;3&#xff09; cdev_add函数 &#xff08;4&#xff09;cdev_del 函数 二、自动创建设备节点 …

4382系列数字荧光示波器

4382系列数字荧光示波器 简述&#xff1a; 4382系列手持式数字荧光示波器具有8个产品型号&#xff0c;带宽200MHz、350MHz、500MHz、1GHz&#xff0c;最高采样率5GSa/s&#xff0c;最大存储深度60kpts/CH&#xff0c;最快波形捕获率10万个波形/秒&#xff0c;独创的Any Acquire…

【每日OJ —— 101. 对称二叉树】

每日OJ —— 101. 对称二叉树 1.题目&#xff1a;101. 对称二叉树2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;101. 对称二叉树 2.解法 2.1.算法讲解 1.该题是判断二叉树是否对称&#xff0c;关键在于&#xff0c;左子树等于右子树&#xff0c;而所给的…

YOLOv8独家原创改进:创新自研CPMS注意力,多尺度通道注意力具+多尺度深度可分离卷积空间注意力,全面升级CBAM

💡💡💡本文自研创新改进:自研CPMS, 多尺度通道注意力具+多尺度深度可分离卷积空间注意力,全面升级CBAM 1)作为注意力CPMS使用; 推荐指数:五星 CPMS | 亲测在多个数据集能够实现涨点,对标CBAM。 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/ca…

代码随想录第二十三天(一刷C语言)|组合总数组合总数II分割回文串

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、组合总数 思路&#xff1a;参考carl文档 定义两个全局变量&#xff0c;二维数组result存放结果集&#xff0c;数组path存放符合条件的结果。&#xff08;这两个变量可以作为函数参数传入…

观海微电子---AF、AG、AR 的差别和作用

一、名称解释及原理 1.AF ---- Anti-fingerprint&#xff0c;中文为抗指纹。一般 SiO2AF 材料&#xff08;DON&#xff0c;M4、道康宁 AF 材料&#xff09;&#xff0c;一般采用真空蒸发镀膜法。 原理&#xff1a;AF 防污防指纹玻璃是根据荷叶原理&#xff0c;在玻璃外表面涂制…

无需公网IP!Apache服务器本地部署与内网穿透实现公网访问

Apache服务安装配置与结合内网穿透实现公网访问 文章目录 Apache服务安装配置与结合内网穿透实现公网访问前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpo…

理解 Python 的 for 循环

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 在本篇博客中&#xff0c;我们将讨论 Python 中 for 循环的原理。 我们将从一组基本例子和它的语法开始&#xff0c;还将讨论与 for 循环关联的 else 代码块的用…

curl --compressed报错,此版本不支持此命令

出现这个问题是因为微软windows自带的curl不支持这个选项,验证如下 执行where curl 时,可以看到输出为 C:\Windows\System32\curl.ee 解决方法是使用其它curl,下载地址如下 curl for Windows https://curl.se/windows/ 然后把安装目录的bin目录放到path环境变量里最开始, 让…

德国进口高速主轴电机在机器人上的应用及选型方案

随着机器人技术的日新月异&#xff0c;高速主轴电机在机器人领域的应用也日趋广泛。德国进口的SycoTec高速主轴电机&#xff0c;以其高转速、高精度、高刚度的特点&#xff0c;在机器人的切割、铣削、钻孔、去毛刺等加工应用中发挥着关键作用。 一、高速主轴电机的特点 SycoT…

SPM/SCM 流量跟踪体系

SPM SPM&#xff08;shopping page mark&#xff0c;导购页面标记&#xff09; 是淘宝社区电商业务&#xff08;xTao&#xff09;为外部合作伙伴&#xff08;外站&#xff09;提供的跟踪引导成交效果数据的解决方案 注&#xff1a;也有解释 SPM 为超级位置模型(Super Position…

基于Arduino的音乐喷泉设计(论文+源码)

1.系统设计 整个Audio Visualizer系统通过锂电池电源进行供电&#xff0c;当Arduino控制板通过蓝牙音频接收器模块与手机蓝牙完成匹配后&#xff0c;然后通过蓝牙音频接收器模块接收来自手机的音乐&#xff0c;接着通过对音乐进行FFT变换来得到音乐的频率数据&#xff0c;接着…