Web 开发 Django 模板
上次为大家介绍了 Django 的模型和自带的管理工具,有了这个工具就可以全自动地根据模型创建后台管理界面,以供网站管理者更方便的管理网站数据。有了网站数据,那怎么样更方便又好看的展示给用户看呢?目前流行的 Web 框架基本都采用 MVC
的架构,而 Django 在这个架构基础上做了一点改变,即 MTV
框架,这里的 T
就是今天我们要讲的 Django 的模板系统( Template )。
认识模板
首先模板是一个文本文件,它定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑,主要用于动态生成 HTML
,即模板包含所需 HTML
输出的静态部分以及描述动态内容将被插入的一些特殊语法。Django 默认内置了一个模板系统 DTL
( Django template language ),在一般项目开发中已足够使用,当然你也可以选择其他第三方模板,一般 Django 项目可以配置一个或多个模板引擎。
使用模板
Django 模板系统其实是 Python 的一个库,只要在代码中引用它,就可以创建并使用模板,但通常情况我们都是把模板和视图结合一起使用的。使用模板一般分两步:
-
创建一个模板文本,或者直接通过文本路径来创建
Template
对象,当然也可以直接在代码中通过字符串创建对象。 -
调用
Template
对象的render()
方法,并传入相应 <K,V> 变量对象,这样我们在模板中配置的变量就会替换为相应的值。
现在我们继续在之前 TestProject
项目下的 polls
应用里面修改代码,进入到 polls
目录下,编辑 views.py
文件如下:
# views.py
from django.http import HttpResponse
from polls.models import Choice, Question
from 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
就能看到我们刚修改完的页面,展示如下图所示:
模板语法规则
上面我们完成了使用模板来输出数据,从而实现了数据与视图的分离。下面我们再来详细介绍下在模板中常用的语法规则:
-
条件判断语法 基本语法:
{% 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 HttpResponse
from polls.models import Choice, Question
from 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
变量,得到的结果如下图: -
-
-
-
循环迭代语法 和大多数语言相同,循环是通过 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.py
from django.http import HttpResponse
from polls.models import Choice, Question
from 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
列表变量,使用循环迭代语法,得到的结果如下图: -
-
-
特殊比较语法
# 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.py
from django.http import HttpResponse
from polls.models import Choice, Question
from 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时,得到的结果如下图: -
-
-
模板过滤器
模板过滤器可以在变量被显示前修改它,过滤器使用管道字符。另外过滤管道可以被套接,即一个过滤器管道的输出又可以作为下一个管道的输入。
# {{ book_name }} 变量被过滤器 lower 处理后,文档大写转换文本为小写。
{{ book_name|lower }}
# 将变量第一个元素转化为大写字母
{{ book_name|first|upper }}
# 将截取变量 book_name 的前10位字符
{{ book_name|truncatewords: "10" }}
当然除了上面三个,还有很多其他过滤器就不再一一介绍,如果有需要可自行搜索,总之可以看出过滤器大大方便我们在模板中的灵活操作。
-
-
模板继承
模板继承就是说可以通过这种方式实现模板的复用,既然需要复用,那我们就需要先创建一个能被复用的模板文件。首先在项目根目录下,创建
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
就能看到我们刚修改完的页面,展示如下图所示:
这样就能更好的实现模板的复用了。
-
模板包含
这个就是通过 {% include %} 语法标签,将一个模板引入另一个或多个模板的内容,代码如下:
{% include "common.html" %}
-
总结
本文为大家介绍了 Django Template 模板基础,可以通过应用的模板实现数据和展示的分离,这样我们可以对前端进行更灵活的展示操作。当然只是简单介绍了下模板,它还有更复杂的使用方式,以后会为大家深入介绍。
相关文章:
Web 开发 Django 模板
上次为大家介绍了 Django 的模型和自带的管理工具,有了这个工具就可以全自动地根据模型创建后台管理界面,以供网站管理者更方便的管理网站数据。有了网站数据,那怎么样更方便又好看的展示给用户看呢?目前流行的 Web 框架基本都采用…...
动态可编辑表单项
遇到的问题:业务需要用户输入对应的username以发送私信给指定对象 方案1-input 输入就完事了 缺陷:要输入,麻烦 <form><label for"recipient-name">发给:</label><input type"text"…...
【Docker入门第一篇】
Docker简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使…...
数据集收集列表(opencv,机器学习,深度学习)持续更新
opencv 车牌识别数据集 opencv 手写数字识别数据集 机器学习 印第安糖尿病 Pima Indians数据集 ,下载地址 Boston波士顿房价数据集 ,下载...
springboot整合rabbitmq发布确认高级
在生产环境中由于一些不明原因,导致 rabbitmq 重启,在 RabbitMQ 重启期间生产者消息投递失败,导致消息丢失,需要手动处理和恢复。于是,我们如何才能进行 RabbitMQ 的消息可靠投递。 发布确认 发布确认方案 架构 配置…...
【linux命令讲解大全】010. mapfile命令和tempfile命令的用法及示例
文章目录 mapfile概要主要用途选项参数返回值例子 tempfile补充说明tempfile 命令$$ 变量 从零学 python mapfile 从标准输入读取行并赋值到数组。 概要 mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array] 主要用途 …...
在 Python 中构建卷积神经网络; 从 0 到 9 的手绘数字的灰度图像预测数字
一、说明 为了预测从0到9的数字,我选择了一个基于著名的Kaggle的MNIST数据集的数据集。数据集包含从 <0> 到 <9> 的手绘图数字的灰度图像。在本文中,我将根据像素数据(即数值数据)和卷积神经网络预测数字。 二、 卷积…...
前端分页处理
页面中实现的分页效果,要么后端提供接口,每次点击下一页就调用接口,若不提供接口,分页得前端自己去截取。 方法一:slice方法 slice(参数1,参数2)方法是返回一个新的数组对象,左开右闭 参数1&…...
【C语言】位操作符的一些题目与技巧
初学者在学完位操作符之后,总是不能很好的掌握,因此这篇文章旨在巩固对位操作符的理解与使用。 有的题目可能会比较难以接受,但是看完一定会有收获 目录 位操作符:一些题目:不创建临时变量交换整数整数转换二进制中1的…...
爬虫逆向实战(二十二)--某恩数据电影票房
一、数据接口分析 主页地址:某恩数据 1、抓包 通过抓包可以发现数据接口是API/GetData.ashx 2、判断是否有加密参数 请求参数是否加密? 无请求头是否加密? 无响应是否加密? 通过查看“响应”模块可以发现,响应是…...
火山引擎发布自研视频编解码芯片
2023年8月22日,火山引擎视频云宣布其自研的视频编解码芯片已成功出片。经验证,该芯片的视频压缩效率相比行业主流硬件编码器可提升30%以上,未来将服务于抖音、西瓜视频等视频业务,并将通过火山引擎视频云开放给企业客户。 火山引…...
投递技术类简历的注意事项
简历修改的背景 作为程序员,随着工作年限的增加,要定期的去修改自己的简历中的工作项目,一方面可以促进自己复盘一下工作成果和个人成长,另外也能给自己换工作提供一个前置的便捷性。 注意事项 修改简历的时候有哪些需要注意的…...
每日一题——柱状图中最大的矩形
柱状图中最大的矩形 题目链接 用什么数据结构? 要得到柱状图中最大的矩形,我们就必须要知道对于每一个高度heights[i],他所能勾勒出的矩形最大是多少(即宽度最大是多少)。 而对应到图上我们可以知道,要知…...
Banana Pi推出基于龙芯2K1000LA处理器的信创工业控制开发平台
Banana Pi推出基于龙芯2K1000LA处理器的信创工业控制开发平台:BPI-5202信创工业控制开发平台 BPI-5202 龙芯2K1000LA 信创工业控制开发平台 1.1 工控机的应用场景 物联网的狂潮,既是一场众多的计算机软硬件厂家(也包括通讯方案和产品厂家&…...
springCloud整合Zookeeper的时候调用找不到服务
SpringCloud整合Zookeeper的时候调用找不到服务 首先,我们在注册中心注册了这个服务: 然后我们使用RestTemplate 调用的时候发现失败了:找不到这个服务: 找了很多资料发现这个必须要加上负载才行 BeanLoadBalanced //负载publi…...
【kubernetes】使用kubepshere部署中间件服务
KubeSphere部署中间件服务 入门使用KubeSphere部署单机版MySQL、Redis、RabbitMQ 记录一下搭建过程 (内容学习于尚硅谷云原生课程) 环境准备 VMware虚拟机k8s集群,一主两从,master也作为工作节点;KubeSphere k8skubesphere devops比较占用磁…...
如何从tabbar页面传数据
无论是百度小程序还是微信小程序,app.json中规定的tabbar页面是不支持传参的,例如: <navigator url../service/service?typeid6 openType"switchTab"> 服务项目 </navigator> 上面的navigater跳转有个属性&#…...
软考高级系统架构设计师系列论文七十四:基于构件的软件开发
软考高级系统架构设计师系列论文七十四:基于构件的软件开发 一、构件相关知识点二、摘要三、正文四、总结一、构件相关知识点 软考高级系统架构设计师系列之:面向构件的软件设计,构件平台与典型架构...
图为科技_边缘计算在智能安防领域的作用
边缘计算在智能安防领域发挥着重要的作用。智能安防系统通常需要处理大量的图像、视频和传感器数据,并对其进行实时分析和处理。边缘计算可以将计算和数据处理功能移动到离数据源更接近的地方,例如摄像头、传感器设备或安防终端。 以下是边缘计算在智能…...
Android 13 - Media框架(7)- NuPlayer::Source
Source 在播放器中起着拉流(Streaming)和解复用(demux)的作用,Source 设计的好坏直接影响到播放器的基础功能,我们这一节将会了解 NuPlayer 中的通用 Source(GenericSource)关注本地…...
MySql015——使用子查询
一、创建customers表 ######################## # Create customers table ######################## use study;CREATE TABLE customers (cust_id int NOT NULL AUTO_INCREMENT,cust_name char(50) NOT NULL ,cust_address char(50) NULL ,cust_city char…...
leetcode 355 设计推特
用链表存储用户发送的每一个推特,用堆获取最先的10条动态 class Twitter {Map<Integer,Set<Integer>> followMap;//规定最新的放到最后Map<Integer,Tweet> postMap;//优先队列(堆)PriorityQueue<Tweet> priorityQueue;int time…...
倒数 2 周|期待 2023 Google开发者大会
9 月 6-7 日,中国上海 前沿科技,新知同享 趣味体验,灵感齐聚 技术生态,多元共进 关注官网最新信息,敬请期待大会开幕 2023 Google 开发者大会官网 相信你一定记得,在今年 5 月的 Google I/O 大会上&am…...
代码随想录day57
516最长回文子序列 class Solution { public:int longestPalindromeSubseq(string s) {vector<vector<int>>dp(s.size(),vector<int>(s.size(),0));for(int i0;i<s.size();i)dp[i][i]1;for(int is.size()-1;i>0;i--){for(int ji1;j<s.size();j){if…...
YOLOv5、v8改进:CrissCrossAttention注意力机制
目录 1.简介 2. yolov5添加方法: 2.1common.py构建CrissCrossAttention模块 2.2yolo.py中注册 CrissCrossAttention模块 2.3修改yaml文件。 1.简介 这是ICCV2019的用于语义分割的论文,可以说和CVPR2019的DANet遥相呼应。 和DANet一样,…...
RabbitMQ特性介绍和使用案例
❤ 作者主页:李奕赫揍小邰的博客 ❀ 个人介绍:大家好,我是李奕赫!( ̄▽ ̄)~* 🍊 记得点赞、收藏、评论⭐️⭐️⭐️ 📣 认真学习!!!🎉🎉 文章目录 RabbitMQ特性…...
Ansible 使用 RHEL 系统角色
安装 RHEL 系统角色软件包,并创建符合以下条件的 playbook /home/greg/ansible/timesync.yml 在所有受管节点上运行 使用 timesync 角色 配置该角色,以使用当前有效的 NTP 提供商 配置该角色,以使用时间服务器 172.25.254.254 配置该角色&am…...
重新认识Android中的线程
线程的几种创建方式 new Thread:可复写Thread#run方法。也可以传递Runnable对象,更加灵活。缺点:缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统的资源导致死机或oom。 new Thread(new…...
前端(十五)——GitHub开源一个react封装的图片预览组件
👵博主:小猫娃来啦 👵文章核心:GitHub开源一个react封装的图片预览组件 文章目录 组件开源代码下载地址运行效果展示实现思路使用思路和api实现的功能数据和入口部分代码展示 组件开源代码下载地址 Gitee:点此跳转下载…...
DELL Power Edge R740 安装 OracleLinux-R7-U9-Server
一、准备好 OracleLinux-R7-U9-Server-x86_64-dvd 安装介子: 二、通过 iDRAC挂dvd 安装介子 三、在 iDRAC 开机控制选择虚拟 CD/DCD/ISO 电源控制选择 复位系统(热启动) 四、进入安装阶段 五、配置时区 六、配置磁盘 七、删除之前的旧分区 …...
制作作业平台网站的设计/个人网站怎么建立
弱口令(weak password) 没有严格和准确的定义,通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令。弱口令指的是仅包含简单数字和字母的口令,例如“123”、“abc”等,因为这样的口令很…...
做英文题的网站/关键词排名监控
gitbook 插件:图片查看 文章目录gitbook 插件:图片查看1. lightbox 插件1.1 安装1.2 配置1.3 效果2. popup 插件2.1 安装2.2 配置2.3 效果1. lightbox 插件 lightbox 插件:单击查看图片 点击图片可显示,大小不变 以弹窗形式查看…...
wordpress浮动标签云/小程序开发需要哪些技术
ListView的下拉刷新很常见,很多开源的框架都能做到这个效果,当然也可以自己去实现。本篇案例是基于xlistview的。 布局: <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android" xmlns:tools"http:/…...
中线企业网站建设的问题/哪里的网络推广培训好
http://my.oschina.net/goal/blog/195749?p1 目录[-] 写在前面的话什么是字节序MSB和LSB大端序小端序网络字节序主机字节序总结pack/unpack详解格式字符翻译格式字符详解unpack的用法一些例子PHP作为一门为web而生的服务器端开发语言,被越来越多的公司所采用。其中…...
网站开发人员的职责/全网营销图片
前言 分析上篇文章的整合的配置文件,我们可以知道配置的bean是成树状结构的,而在树的最顶层是类型为org.mybatis.Spring.SqlSessionFactoryBean的bean,它将其他相关的bean组装在了一起,那么我们的分析就从此类开始。 sqlSessionFa…...
网站开发技术文档/站长工具seo综合查询可以访问
2019独角兽企业重金招聘Python工程师标准>>> 昨天在win7下尝试了三种方法安装linux,只有最笨的一种成功了……简单说一下吧 第一种:使用EasyBCD安装 1、将硬盘分出一个小于32G的空间,并将其格式化为FAT32格式(要格式化…...