Django 模板引擎 (四)

news2024/9/20 18:50:01

一、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.coloradmin.cn/o/1273665.html

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

相关文章

高效率:使用DBeaver连接spark-sql

提高运行效率一般采取底层使用spark引擎替换成hive引擎的方式提高效率&#xff0c;但替换引擎配置较为复杂考虑到兼容版本且容易出错&#xff0c;所以本篇将介绍使用DBeaver直接连接spark-sql快速操作hive数据库。 在spark目录下运行以下命令&#xff0c;创建一个SparkThirdSe…

TA、TB、TC油封各自用途

在机械系统应用中&#xff0c;油封在防止润滑剂从机器和轴承间隙泄漏方面发挥着至关重要的作用。在各种类型的油封中&#xff0c;常用的是TA、TB、TC密封件。本文将深入探讨这三种密封件各自的用途。 TA、TB和TC密封件都是油封的类型&#xff0c;但它们的设计和应用有所不同。…

java设计模式学习之【对象池模式】

文章目录 引言对象池模式简介定义与用途实现方式 使用场景优势与劣势对象池模式在Spring中的应用JDBC对象池示例代码地址小结 引言 对象池模式在资源管理和性能优化方面发挥着重要作用。这种模式通过重复使用已经初始化的对象&#xff0c;而不是频繁创建和销毁&#xff0c;减少…

计算机体系结构----流水线技术(三)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----计算机系统结构教程(第二版)张晨曦等 计算机体系结构----流水线技术&#xff08;三&#xff09; 3.1 流水线的基本概念3.1.1 什么是流水线3.1.2 流水线的分类1. 部件级流水线、处理机级流…

图解系列--HTTPS,认证

确保 Web 安全的HTTPS 1.HTTP 的缺点 1.1.通信使用明文可能会被窃听 加密处理防止被窃听 加密的对象可以有这么几个。 (1).通信的加密 HTTP 协议中没有加密机制&#xff0c;但可以通过和 SSL&#xff08;Secure Socket Layer&#xff0c;安全套接层&#xff09;或TLS&#xff…

搭建JMeter分布式压测环境轻松应对

引言 您想要提高您的应用程序的性能吗&#xff1f;想要确保它在高负载下仍然能够正常工作吗&#xff1f;那么&#xff0c;您一定需要一个可靠的性能测试工具来帮助您完成这个任务。 JMeter是一个广泛使用的性能测试工具&#xff0c;但是如果您的测试需求变得更加复杂和庞大&a…

数据结构与算法编程题35

用按层次顺序遍历二叉树的方法&#xff0c;统计树中具有度为1的结点数目。 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define Maxsize 100 #define STR_SIZE 1024typedef struct B…

Google Chrome访问出现 NET::ERR_CERT_INVALID

Google Chrome访问出现 NET::ERR_CERT_INVALID然后访问不了当前网站&#xff0c;这个是由于证书失效了&#xff0c;临时解决方式是&#xff1a; 第一种方案&#xff1a; 在Chrome提示“您的连接不是私密连接”页面的空白区域点击一下&#xff0c;然后输入“thisisunsafe”(页…

[CustomMessages] section

[CustomMessages] section用来定义自定义的一些{cm:}常量. 一个定义和使用的例子。 [CustomMessages] CreateDesktopIconCreate a &desktop icon[Tasks] Name: desktopicon; Description: "{cm:CreateDesktopIcon}"CustomMessages是支持带参数的&#xff0c;从…

「Verilog学习笔记」状态机-重叠序列检测

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 读入数据移位寄存&#xff0c;寄存后的数据与序列数做对比&#xff0c;相等则flag为1&#xff0c;不等则为0 timescale 1ns/1nsmodule sequence_test2(input wire clk ,in…

Ascend C 算子开发遇到的问题及解决方法

摘要&#xff1a;在学习Ascend C算子开发进阶课程的时候&#xff0c;进行Ascend C自定义算子工程、算子调用等实验&#xff0c;在开发环境中遇到了一些问题&#xff0c;在这里记录一下。 首先如果在启智社区CANN版本为6.3 &#xff0c;要进行Ascend C算子开发&#xff0c;需要…

TA-Lib学习研究笔记——Volume Indicators (四)

TA-Lib学习研究笔记——Volume Indicators &#xff08;四&#xff09; 1.AD Chaikin A/D Line 量价指标 函数名&#xff1a;AD 名称&#xff1a;Chaikin A/D Line 累积/派发线&#xff08;Accumulation/Distribution Line&#xff09; 简介&#xff1a;Marc Chaikin提出的一…

C++ 学习之匿名名字空间的使用细节

匿名命名空间&#xff08;anonymous namespace&#xff09;是C中的一种特殊命名空间&#xff0c;它没有显式的名称。匿名命名空间可以用来定义仅在当前文件中可见的全局变量、函数和类。 由于没有名字&#xff0c;所以相当于直接引入&#xff0c;但是没有引入定义 如果发生冲…

Influx集群解决方案(Influx Proxy篇)

InFluxDB 集群搭建 本次搭建使用influx proxy 介绍 github地址:https://github.com/chengshiwen/influx-proxy/ Influx Proxy 是一个基于高可用、一致性哈希的 InfluxDB 集群代理服务&#xff0c;实现了 InfluxDB 高可用集群的部署方案&#xff0c; 具有动态扩/缩容、故障恢复…

JRT和检验共用的打印层实现

之前对接的打印和导出是C#实现的&#xff0c;如果要完全Java化就需要用Java把打印元素绘制协议用Java实现&#xff0c;这次介绍实现主体搭建&#xff0c;最终使JRT达到完全信创和跨平台目标。到这篇后&#xff0c;所有的Java难题都解决完毕&#xff0c;几天到几周之内就可以把打…

Echarts大屏可视化_04 横向柱状图模块的引入和开发

模块的引入 1.寻找官方示例引入 ECharts官方实例入口 2.引入示例 ECharts 示例 可从这里直接进入 标题、提示信息、图例都不需要所以直接删掉 <div class"column"><div class"panel bar2"><h2>柱状图-技能掌握</h2><div cla…

项目动态 | 十一月重点上线项目集锦

武清联创商会 【应用场景】商协会资源对接服务平台&#xff1b; 【核心功能】 l 利用资源对接系统&#xff0c;用户可在平台内发布自己的人脉信息、个性化标签&#xff0c;通过对接获得收益&#xff0c;实现人脉增值&#xff1b; l 利用信息发布系统&#xff0c;用户可直观…

UEFI与ESKII源代码分析

这是一本未出版的电子书&#xff0c;是UEFI BIOS从业者的非常重要的参考书籍。需要的朋友可以联系我。

微服务实战系列之EhCache

前言 书接前文&#xff0c;继续深耕。上一篇博主对Redis进行了入门级介绍&#xff0c;大体知道了Redis可以干什么以及怎么使用它。 今日博主继续带着大家学习如何使用EhCache&#xff0c;这是一款基于Java的缓存框架。 微服务实战系列之Redis微服务实战系列之Cache微服务实战…

主成分分析例题 (多元统计分析期末复习)

例一 给定X的协差阵&#xff0c;对其进行主成分分析, &#xff08;1&#xff09;求出每个主成分的贡献率&#xff1b; &#xff08;2&#xff09;求出每个原始变量的信息提取率&#xff1b; 解&#xff1a;对于主成分分析的题&#xff0c;一般来说&#xff0c;题目给定一个协方…