Web 开发 Django 模板

news2025/3/3 4:16:17

上次为大家介绍了 Django 的模型和自带的管理工具,有了这个工具就可以全自动地根据模型创建后台管理界面,以供网站管理者更方便的管理网站数据。有了网站数据,那怎么样更方便又好看的展示给用户看呢?目前流行的 Web 框架基本都采用 MVC 的架构,而 Django 在这个架构基础上做了一点改变,即 MTV 框架,这里的 T 就是今天我们要讲的 Django 的模板系统( Template )。

认识模板

首先模板是一个文本文件,它定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑,主要用于动态生成 HTML ,即模板包含所需 HTML 输出的静态部分以及描述动态内容将被插入的一些特殊语法。Django 默认内置了一个模板系统 DTL( Django template language ),在一般项目开发中已足够使用,当然你也可以选择其他第三方模板,一般 Django 项目可以配置一个或多个模板引擎。

使用模板

Django 模板系统其实是 Python 的一个库,只要在代码中引用它,就可以创建并使用模板,但通常情况我们都是把模板和视图结合一起使用的。使用模板一般分两步:

  1. 创建一个模板文本,或者直接通过文本路径来创建 Template 对象,当然也可以直接在代码中通过字符串创建对象。

  2. 调用 Template 对象的 render() 方法,并传入相应 <K,V> 变量对象,这样我们在模板中配置的变量就会替换为相应的值。

现在我们继续在之前 TestProject 项目下的 polls 应用里面修改代码,进入到 polls 目录下,编辑 views.py 文件如下:

# views.py
from django.http import HttpResponsefrom polls.models import Choice, Questionfrom django.utils import timezone# 导入模板相关库from django.template import Template, Context
# 修改之前 index 页面为模板渲染def index(request):    # 定义模板    t = Template('你好<span style="color:#FF0000">{{ name }}</span>, 这是一个投票页面。')    # 定义传入对象    c = Context({'name': '张三'})    # 返回渲染模板    return HttpResponse(t.render(c))
# …… 忽略部分代码

修改完成并保存,先通过命令 python manage.py runserver 127.0.0.1:8080 启动本地 server,然后通过访问 URL http://127.0.0.1:8080/polls 就能看到我们刚修改完的页面,展示如下图所示:

图片

模板语法规则

上面我们完成了使用模板来输出数据,从而实现了数据与视图的分离。下面我们再来详细介绍下在模板中常用的语法规则:

  1. 条件判断语法 基本语法:

     {% if 条件 %} #   满足条件展示内容 {% endif %}
     # 或者
     {% if 条件1 %} #   满足条件1展示 {% elif 条件2 %} #   满足条件2展示 {% else %} #   不满足条件1条件2的展示 {% endif %}

    另外,条件判断还支持 and , or 或者 not 关键字来对多个变量进行判断,模板代码如下:

     {% if 变量1 and 变量2 %} #   当变量1或者变量2为 true ,那就展示此处模板内容 {% endif %}

    现在我们继续在 TestProject 项目下的 polls 应用里面修改代码,进入到 polls 目录下,编辑 views.py 文件如下:

    # views.py
    from django.http import HttpResponsefrom polls.models import Choice, Questionfrom django.utils import timezone# 导入模板相关库from django.template import Template, Context
    # 修改之前 index 页面为模板渲染def index(request):    # 定义模板    t = Template('{%if name %}你好<span style="color:#FF0000">{{ name }}</span>,{% else %} 你好游客, {% endif %} 这是一个投票页面。')    # 定义传入对象    c = Context({'name': '张三'})    # 返回渲染模板    return HttpResponse(t.render(c))
    # …… 忽略部分代码

    刷新页面,发现跟之前页面没有区别,因为我们这里 Context 里传入了 name 变量,如果不传 name 变量,得到的结果如下图:

    图片

  2. ​​​​​​​
  3. 循环迭代语法 和大多数语言相同,循环是通过 for 语法实现,每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容。

     {% for book in book_list %}     <li>{{ book.name }}</li> {% endfor %}
     # 或者 可以增加 reversed 标签反向迭代 book_list
     {% for book in book_list reversed %}     <li>{{ book.name }}</li> {% endfor %}

    我们继续在 TestProject 项目下的 polls 应用里面修改代码,编辑 views.py 文件如下:

    # views.pyfrom django.http import HttpResponsefrom polls.models import Choice, Questionfrom django.utils import timezone# 导入模板相关库from django.template import Template, Context
    # 修改之前 index 页面为模板渲染def index(request):    # 定义模板    t = Template(' 以下{% for name in name_list %} <li>{{ name }}</li>  {% endfor %}  请选择?')    # 定义传入对象    c = Context({'name_list': ('张一','张二','张三')})    # 返回渲染模板    return HttpResponse(t.render(c))# …… 忽略部分代码

    刷新页面,这里在 Context 里传入了 name_list 列表变量,使用循环迭代语法,得到的结果如下图:

    图片

  4. ​​​​​​​
  5. ​​​​​​​
  6. 特殊比较语法

     # ifequal/ifnotequal 语法用于更直接的比较两个变量是否相等 {% ifequal user 'admin' %}     <h1>这是一个管理员页面!</h1> {% endifequal %} # 或者 {% ifnotequal user 'admin' %}     <h1>这是是一个游客页面!</h1> {% endifnotequal %} # 和条件判断语法类似, {% ifequal %} 支持可选的 {% else%} 标签 {% ifequal user 'admin' %}     <h1>这是一个管理员页面!</h1> {% else %}     <h1>这是是一个游客页面!</h1> {% endifequal %}

    我们继续在 TestProject 项目下的 polls 应用里面修改代码,编辑 views.py 文件如下:

    # views.pyfrom django.http import HttpResponsefrom polls.models import Choice, Questionfrom django.utils import timezone# 导入模板相关库from django.template import Template, Context# 修改之前 index 页面为模板渲染def index(request):    # 定义模板    t = Template('{% ifequal type 1 %}你好<span style="color:#FF0000"> 管理员</span>,这是个管理页面。{% else %} 你好游客, 这是一个投票页面。{% endifequal %}')    # 定义传入对象    c = Context({'type': 1})    # 返回渲染模板    return HttpResponse(t.render(c))# …… 忽略部分代码

    刷新页面,这里在 Context 里传入了 type 变量,当变量传入1时,得到管理页面,如果不是1则还是原来的页面,type 传入 1时,得到的结果如下图:

    图片

  7. ​​​​​​​
  8. ​​​​​​​
  9. 模板过滤器

    模板过滤器可以在变量被显示前修改它,过滤器使用管道字符。另外过滤管道可以被套接,即一个过滤器管道的输出又可以作为下一个管道的输入。

      # {{ book_name }} 变量被过滤器 lower 处理后,文档大写转换文本为小写。   {{ book_name|lower }}  # 将变量第一个元素转化为大写字母   {{ book_name|first|upper }}  # 将截取变量 book_name 的前10位字符  {{ book_name|truncatewords: "10" }}
    

    当然除了上面三个,还有很多其他过滤器就不再一一介绍,如果有需要可自行搜索,总之可以看出过滤器大大方便我们在模板中的灵活操作。

  10. ​​​​​​​
  11. 模板继承

    模板继承就是说可以通过这种方式实现模板的复用,既然需要复用,那我们就需要先创建一个能被复用的模板文件。首先在项目根目录下,创建 templates 目录用来存放模板文件,并在该目录下创建 common.html 文件用于复用,编写如下代码:

      <html>    <head>        <title>公共页面</title>    </head>    <body>        <h1>你好<span style="color:#FF0000">{{ name }}</span>,这是一个公共页面!</h1>        {% block mainbody %}        <p>原始页</p>        {% endblock %}    </body>  </html>

    然后再创建 index.html 模板文件,并在文件中编写代码,实现对 common.html 模板文件的利用。

        {% extends "common.html" %}    {% block mainbody %}    <p>这里继承了 common.html 模板!</p>    {% endblock %}

    最后修改项目目录下,TestProject/settings.py 配置文件,在配置文件找到 TEMPLATES 对象,并在修改其中 DIRS 的配置路径如下:

        TEMPLATES = [        {            'BACKEND': 'django.template.backends.django.DjangoTemplates',            'DIRS': [BASE_DIR,'templates',],     # 修改模板配置路径            'APP_DIRS': True,            'OPTIONS': {                'context_processors': [                    'django.template.context_processors.debug',                    'django.template.context_processors.request',                    'django.contrib.auth.context_processors.auth',                    'django.contrib.messages.context_processors.messages',                ],            },        },    ]

    好了,现在模板配置完成,下一步要修改我们的渲染页面,再次打开 polls 应用下的 views.py, 把主页代码注释,然后重新编写主页代码如下:

        from django.shortcuts import render    from django.http import HttpResponse    from polls.models import Choice, Question    from django.utils import timezone    from django.template import Template, Context    # 注释原代码    #def index(request):    #    return HttpResponse("你好,这是一个投票页面。")    #    t = Template('你好<span style="color:#FF0000">{{ name }}</span>, 这是一个投票页面。')    #    c = Context({'name': '张三'})    #    return HttpResponse(t.render(c))    # 增加新代码    def index(request):        context = {}        context['name'] = '张三'        # 返回模板渲染后的主页界面        return render(request, 'index.html', context)​​​​​​​​​​​​​​​​​​​​​​​​​​​​

修改完成,最后通过访问 URL http://127.0.0.1:8080/polls 就能看到我们刚修改完的页面,展示如下图所示:

图片

这样就能更好的实现模板的复用了。

  1. 模板包含

    这个就是通过 {% include %} 语法标签,将一个模板引入另一个或多个模板的内容,代码如下:

      {% include "common.html" %}
    
  2. ​​​​​​​

总结

本文为大家介绍了 Django Template 模板基础,可以通过应用的模板实现数据和展示的分离,这样我们可以对前端进行更灵活的展示操作。当然只是简单介绍了下模板,它还有更复杂的使用方式,以后会为大家深入介绍。

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

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

相关文章

KFC框架:小游戏/H5 首包、分包、加载优化方案与项目示例

Cocos Creator 小游戏/H5 首包、分包、加载优化方案与项目示例 今天是疯狂星期四&#xff0c;给大家晒一下最近的成果。 麒麟子上周末将 《Jare 大冒险》 升级到了 Cocos Creator 3.8&#xff0c;并更新到了 Cocos Store。 在做了更精细的分包管理、资源加载拆分&#xff0c;…

办公室隔断,不同人员办公空间隔断设计要求

针对不同人员的办公空间隔断设计&#xff0c;需要考虑到他们的工作性质、隐私需求以及协作方式等因素。以下是一些常见人员类型的办公室隔断设计要求建议&#xff1a; 1. 管理层和高层领导&#xff1a; - 私密性与开放性平衡&#xff1a;管理层通常需要一定的私密性&#xff0c…

AI降温?创业者和投资人不这么想

2023年7月23日&#xff0c;超声波俱乐部AI Open Day在北京举办&#xff0c;百位AI领域顶级创业者、知名投资人汇聚一堂。 超声波创始人杨子超、紫辉创投创始合伙人&CEO郑刚、着魔APP创始人杨磊、豆语星辰CEO阎鹏、SpaceU联合创始人牟奇、Musical.ly天使投资人范路进行了一…

【面试 反思】Retrofit源码与设计 7 连问

前言 在实际项目中往往是使用Retrofit来做网络请求工作。Retrofit采用RESTful风格&#xff0c;本质上只是对OkHttp进行封装&#xff0c;今天我们根据几个问题来进一步学习一下Retrofit的源码与设计思想。 1. 使用方法 直接看一下官方介绍的使用方法。 public final class S…

STM32之17.PWM脉冲宽度调制

一LED0脉冲宽度调制在TIM14_CHI&#xff0c;先将LED&#xff08;PF9&#xff09;代码配置为AF推挽输出模式&#xff0c;将PF9引脚连接到TIM14&#xff0c; #include <stm32f4xx.h>static GPIO_InitTypeDef GPIO_InitStruct;void Led_init(void) {//打开端口F的硬件时钟&a…

021-从零搭建微服务-短信服务(一)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;https://gitee.com/csps/mingyue 源码地址&#xff08;前端&#xff09;&#xff1a;https://gitee.com/csps…

Git gui教程---第八篇 Git gui的使用 创建一个分支

一般情况下一个主分支下代码稳定的情况下会新建出一个分支&#xff0c;然后在分支上修改&#xff0c;修改完成稳定后再合并到主分支上。 或者几个人合作写一份代码&#xff0c;每个人各一个分支&#xff0c;测试稳定再合并到主分支上。 在git gui选择菜单栏“分支”&#xff0…

centos7安装hadoop 单机版

1.解压 &#xff08;1&#xff09;将hadoop压缩包复制到/opt/software路径下 &#xff08;2&#xff09;解压hadoop到/opt/module目录下 [rootkb135 software]# tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/ &#xff08;3&#xff09;修改hadoop属主和属组 [rootkb135 m…

VirtualBox虚拟机安装Centos7详细教程图解

一、前期准备工作&#xff1a; 1、虚拟机下载 VirtualBox版本&#xff1a;7.0.6 下载 VirtualBox 的下载页面&#xff1a;https://www.virtualbox.org/wiki/Downloads VMWare 虚拟机软件&#xff08;收费的&#xff0c;要使用请购买正版软件&#xff09;的官网&#xff1a;…

Springboot中sharding-jdbc的API模式并使用自定义算法

Springboot中sharding-jdbc的API模式并使用自定义算法 可配合AbstractRoutingData使用切换数据源 程序用到了AbstractRoutingData来切换数据源&#xff08;数据源是自定义的格式编写并没有用springboot的自动装配的格式写&#xff09;&#xff0c;但是又用到sharding-jdbc进行…

pycharm添加虚拟环境以及虚拟环境安装pytorch

file、settings、interpreter、add interpreter、add local interpreter 记住不要勾选inherit&#xff0c;不然会把主环境的东西继承到虚拟环境。 创建前可以先点existing看看有没有已经建好的虚拟环境 有的时候pycharm有问题&#xff0c;创建了虚拟环境没有显示。找一个.py文…

交通网络分析性能再升级,SuperMap iServer新增开启SSC分析模型

导语 SSC分析模型&#xff0c;全名SuperMap Short Cut&#xff0c;底层采用Contraction Hierarchies&#xff08;简称CH&#xff09;算法&#xff0c;该算法旨在通过对图形进行预处理和优化来降低最佳路径分析的时间复杂度。SuperMap iServer 11i&#xff08;2023&#xff09;&…

scikit-learn中OneHotEncoder用法

One-Hot编码&#xff0c;又称为一位有效编码&#xff0c;是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值&#xff0c;然后&#xff0c;每个整数值被表示为二进制向量&#xff0c;将整数索引标记为1&#xff0c;其余都标为0。 OneHotEncoder()常用参数解释 …

【Winform学习笔记(十)】TextBox文本框控件 光标定位到文本末尾的方法

TextBox文本框控件 光标定位到文本末尾的方法 前言正文1、具体代码2、使用示例 前言 本文中主要介绍实现 TextBox 文本框控件的光标定位到文本末尾的方法. 正文 1、具体代码 /// <summary> /// TextBox文本框控件 光标定位到文本末尾的方法 /// </summary> ///…

next.js报错点

next.js报错点 1.类型“{ children: ReactNode; }”与类型“IntrinsicAttributes”不具有相同的属性。2. 不能将类型“void[]”分配给类型“ReactNode”&#xff1f;3.useRouter only works in Client Components. Add the "use client" directive at the top of the…

IDEA的maven想显示层级关系,而非平级

新版和旧版的IDEA的位置不一样&#xff0c;2023.2.1的版本在右上角的“” 这个位置 如图所示&#xff1a; 然后点击按模块分组&#xff1a;

[Stable Diffusion教程] 第一课 原理解析+配置需求+应用安装+基本步骤

第一课 原理解析配置需求应用安装基本步骤 本次内容记录来源于B站的一个视频 以下是自己安装过程中整理的问题及解决方法&#xff1a; 问题&#xff1a;stable-diffusion-webui启动No Python at ‘C:\xxx\xxx\python.exe‘ 解答&#xff1a;打开webui.bat 把 if not de…

从零开始的自动化测试框架——Web篇01

Selenium 谈到web自动化&#xff0c;逃不开的一定会是Selenium。这是最为主流&#xff0c;也是最广为人知的一项web自动化产物。但目前业内web自动化其实主要分为以下方向&#xff1a; Selenium&#xff0c;核心主流自动化技术&#xff0c;功能齐全&#xff0c;一般是搭配web…

【算法日志】动态规划刷题:01背包问题,多重背包问题(day37,day38)

代码随想录刷题60Day 目录 前言 目标和&#xff08;01背包&#xff09; 一和零&#xff08;01背包&#xff09; 零钱兑换&#xff08;多重背包&#xff09; 排列总和&#xff08;多重背包&#xff09; 前言 这两天都是背包问题&#xff0c;其中的01背包的一些应用问题需要…

迈步从头越——同为科技(TOWE)22周年庆典活动圆满举行

8月23日&#xff0c;同为科技&#xff08;TOWE&#xff09;迎来公司成立22周年纪念日&#xff0c;这是属于TOWE品牌的又一里程碑时刻。从2001到2023&#xff0c;从产品到品牌&#xff0c;从技术到服务&#xff0c;同为科技&#xff08;TOWE&#xff09;始终秉承着专注于终端设备…