前言

在之前的文章中,视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的页面大多是带有样式的HTML代码,这可以让浏览器渲染出非常漂亮的页面。目前市面上有非常多的模板系统,其中最知名最好用的就是DTL和jinja2。DTL是Django Template Language 三个单词的缩写,也就是Django自带的模板语言。当然也可以配置Django支持jinja2等其他模板引擎,但是作为Django内置的模板语言,和Django可以达到无缝衔接而不会产生一些不兼容的情况。因此建议大家学习好DTL。


一、DEL与普通的HTML文件的区别

DTL模板是一种带有特殊语法的HTML文件,这个HTML文件可以被Django编译,可以传递参数进去,实现数据动态化。在编译完成后,生成一个普通的HTML文件,然后发送给客户端。

二、渲染模板 

Django提供了一个简便的方式,直接将模板染成字符串和包装成HttpResponse对象一步到位完成。

1.创建templates文件夹,所有的html模板将放入其中

2.找到settings.py文件将模板路径输入其中

'DIRS': [os.path.join(BASE_DIR,'./templates')],

 3.准备HTML模板 index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>你好</title>
</head>
<body><h1>我的第一个标题</h1><p>我的第一个段落</p>
</body>
</html>

4.编写视图函数

#app应用中 views.py文件
from django.shortcuts import render
#模板应用
def index(request):return render(request,template_name="index.html")

5.编写路由

#app应用中 urls.py文件
from django.contrib import admin
from django.urls import path
from app import views
urlpatterns = [path('admin/', admin.site.urls),path('',views.index, name='index')

三、DTL模板语法

1.变量

模板中可以包含变量,Django在渲染模板的时候,可以传递变量对应的值过去进行替换。变量的命名规范和Python非常类似,只能是阿拉伯数字和英文字符以及下划线的组合,不能出现标点符号等特殊字符。变量需要通过视图函数渲染,视图函数在使用render或者render_to_string的时候可以传递一个context的参数,这个参数是一个字典类型。以后在模板中的变量就从这个字典中读取值的。

1.编写视图函数

#app应用中 views.py文件
#动态传值
def info(request):#1.普通变量username = '你好,世界'# return render(request,template_name="info.html", context={'username':username})#2.字典类型book = {'name':"水浒传",'author':'施耐庵'}# return render(request, template_name="info.html", context={'username': username,'book':book})#3.列表类型books = [{'name':'水浒传','author':'施耐庵'},{'name':'三国演义','author':'罗贯中'}]# context = {#     'username':username,#     'book':book,#     'books':books# }# return render(request, template_name="info.html", context=context)#4.对象class Person:def __init__(self):self.realname = '张安'context = {'username': username,'book': book,'books': books,'person':Person()}return render(request, template_name="info.html", context=context)

2.编写路由

#app应该中 urls.py文件
from django.contrib import admin
from django.urls import path
from app import viewsurlpatterns = [path('admin/', admin.site.urls),path('',views.index, name='index'),path('info',views.info,name='info')]

3.编写html文件(info.html)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>你好</title>
</head>
<body><h1>{{ username }}</h1><h1>{{ book.name }}</h1><h1>{{ books.1.name}}</h1><h1>{{ person.realname}}</h1></body>
</html>

四、常用标签

1.if标签

if标签:if标签相当于python中的if语句,有elif和else相对应,但是所有的标签都需要用标签符号({%%})进行包裹。if标签中可以使用=、!=、<、<=、>、>=、in、not in、is、is not等运算符

1.编写视图函数

#app应用views.py中l
def index(request):age = 20return render(request,template_name='index.html',context={'age':age})

2.编写路由

#主路由 urls.py
path('if',views.if_,name='if')

3.编写html

#if.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>你好</title>
</head>
<body>{% if age > 18 %}<p>你可以进去了</p>{% elif age < 18 %}<p>你不可以进去</p>{% endif %}
</body>
</html>

2.for标签

for...in...标签:for...in...类似于python中的for...in...。可以遍历列表、元组、字符串、字典等一切可以遍历的对象。

1.编写视图函数

#app应用 views.py中
def for_(request):#1.列表books = [{'name': '水浒传', 'author': '施耐庵'},{'name': '三国演义', 'author': '罗贯中'}]#2.字典# for x in person.items/keys/valuesperson ={'realname':"张三","age":18,"height":180}context = {'books':books,"person":person}return render(request,template_name='for.html',context=context)

2.编写路由

#主路由的urls.py
path('for',views.for_,name='for')

3.编写html

#for.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>你好</title>
</head>
<body><table><tbody>{% for book in books %}<tr><td>{{ book.name }}</td><td>{{ book.author }}</td></tr>{% endfor %}</tbody>
</table>
<div>{% for key, value in person.items %}<p> {{ key }} : {{ value }} </p>{% endfor %}
</div>
</body>
</html>

如果想要反向遍历,那么在遍历的时候就加上一个reversed。

{% for person in persons reversed %}<p>{{ person.name }}</p>
{% endfor %}

在for循环中,DTL提供了一些变量可供使用。这些变量如下:

  • forloop.counter:当前循环的下标。以1作为起始值。

  • forloop.counter0:当前循环的下标。以0作为起始值。 forloop.revcounter:当前循环的反向下标值。比如列表有5个元素,那么第一次遍历这个属性是等于5,第二次是4,以此类推。并且是以1作为最后一个元素的下标。

  • forloop.revcounter0:类似于for1oop.revcounter。不同的是最后一个元素的下标是从0开始。

  • forloop.first:是否是第一次遍历。

  • forloop.last:是否是最后一次遍历

  • forloop.parentloop:如果有多个循环嵌套,那么这个属性代表的是上一级的for循环。

3.with标签

with标签:在模版中定义变量。有时候一个变量访问的时候比较复杂,那么可以先把这个复杂的变量缓存到一个变量上,以后就可以直接使用这个变量就可以了。

1.编写视图函数

#app应用 views.py中
def with_(request):context ={'books':[{'name': '水浒传', 'author': '施耐庵'},{'name': '三国演义', 'author': '罗贯中'}]}return render(request,template_name='with.html',context=context)

 2.编写路由

#主路由中的urls.pypath('with',views.with_,name='with')

3.编写html

#with.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>你好</title>
</head>
<body>{% with book1 = book.1 %}<p>{{ book1.name }}/{{ book1.author }}</p>
{% endwith %}</body>
</html>

4.url标签

url标签:在模版中,我们经常要写一些url,比如某个a标签中需要定义href属性。当然如果通过硬编码的方式直接将这个url写死在里面也是可以的。但是这样对于以后项目维护可能不是一件好事。因此建议使用这种反转的方式来实现,类似于django中的reverse一样。

1.编写视图函数

#app应用 views.py中
def url_(request):return render(request,template_name='url.html')def book_id(request,book_id):return HttpResponse("您的图书id:{}".format(book_id))

2.编写路由

#主路由中的urls.pypath('url',views.url_,name='url'),path('book/int:<book_id>',views.book_id,name='book_id')

3.编写html

#url.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>你好</title>
</head>
<body><a href="{% url 'for' %}">for.html</a>
<a href="{% url 'book_id' 1 %}">图书列表</a></body>
</html>

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

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

相关文章

mysql6表清理跟回收空间

mysql6表清理跟回收空间 文章目录mysql6表清理跟回收空间1.清理表2.备份表或者备份库3.回收表空间4.查看5.验证业务1.清理表 ## 登录 C:\Program Files\MySQL\MySQL Server 5.6\bin>mysql -uroot -p Enter password: ****** Welcome to the MySQL monitor. Commands end w…

Java-74 深入浅出 RPC Dubbo Admin可视化管理 安装使用 源码编译、Docker启动

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; AI炼丹日志-30-新发布【1T 万亿】参数量大模型&#xff01;K…

VSCode同时支持Vue2和Vue3开发的插件指南

引言 随着Vue生态系统的演进&#xff0c;许多开发者面临着在同一开发环境中同时处理Vue 2和Vue 3项目的需求。Visual Studio Code (VSCode)作为最受欢迎的前端开发工具之一&#xff0c;其插件生态对Vue的支持程度直接影响开发效率。本文将深入探讨如何在VSCode中配置插件组合&a…

卷积神经网络CNN的Python实现

一、环境准备与库导入 在开始实现卷积神经网络之前&#xff0c;需要确保开发环境已正确配置&#xff0c;并导入必要的Python库。常用的深度学习框架有TensorFlow和PyTorch&#xff0c;本示例将基于Keras&#xff08;可使用TensorFlow后端&#xff09;进行实现&#xff0c;因为K…

js是实现记住密码自动填充功能

记住密码自动填充使用js实现记住密码功能&#xff0c;在下次打开登陆页面的时候进行获取并自动填充到页面【cookie和localStorage】使用js实现记住密码功能&#xff0c;在下次打开登陆页面的时候进行获取并自动填充到页面【cookie和localStorage】 //添加功能----记住上一个登陆…

【Java】文件编辑器

代码&#xff1a;&#xff08;SimpleEditor.java&#xff09;import java.awt.Color; import java.awt.Font; import java.awt.Insets; import java.awt.BorderLayout;import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import java.io.BufferedReader…

PyTorch中torch.topk()详解:快速获取最大值索引

torch.topk(similarities, k=2).indices 是什么意思 torch.topk(similarities, k=2).indices 是 PyTorch 中用于获取张量中最大值元素及其索引的函数。在你的代码中,它的作用是从 similarities 向量里找出得分最高的2个元素的位置索引。 1. 核心功能:找出张量中最大的k个值…

快速搭建本地HTTP服务器:`python -m http.server`详解

文章目录 一、什么是 http.server? 二、基础使用 1. 启动服务器 2. 指定端口 3. 绑定特定IP 三、实际应用场景 1. 本地前端开发 2. 文件共享 3. 启用CGI脚本(高级) 四、目录浏览详解* 五、安全注意事项 六、进阶技巧 1. 后台运行(Linux/macOS) 2. 自定义错误页面 3. 结合其…

运维技术教程之Jenkins上的known_hosts文件

在Jenkins中&#xff0c;known_hosts文件用于存储已验证的远程节点主机密钥&#xff0c;避免每次连接时重复验证。以下是基于不同场景的解决方案&#xff1a;1. 创建并配置 known_hosts 文件 若Jenkins提示 No Known Hosts file 或找不到文件&#xff0c;需手动创建并配置&…

leetcode 3201. 找出有效子序列的最大长度 I 中等

给你一个整数数组 nums。nums 的子序列 sub 的长度为 x &#xff0c;如果其满足以下条件&#xff0c;则称其为 有效子序列&#xff1a;(sub[0] sub[1]) % 2 (sub[1] sub[2]) % 2 ... (sub[x - 2] sub[x - 1]) % 2返回 nums 的 最长的有效子序列 的长度。一个 子序列 指的…

Java并发编程第三篇(深入解析Synchronized)

1. Synchronized简介&#xff1a;一个常见的并发“陷阱” 在正式开始学习新知识前&#xff0c;我们不妨先来看一个现象&#xff0c;这是一个很多并发编程新手都会遇到的“陷阱”&#xff1a; public class SynchronizedDemo implements Runnable {// 共享变量private static in…

Chatbox AI|多模型多模态交互+MCP,一个工具打造你的全能私人助手

ChatBoxAI集成GPT-4、Claude等顶尖模型&#xff0c;支持Windows/macOS/Linux多平台&#xff0c;具备隐私加密、文件智能解析&#xff08;PDF/代码/图片&#xff09;及开发者友好特性。其应用覆盖自媒体创作、代码实时预览、AI绘图&#xff08;封面/表情包&#xff09;及联网搜索…

在Autodl服务器中使用VNC建立图形界面

在Autodl服务器中使用VNC建立图形界面**AutoDL 3D 图形桌面搭建教程****第一步&#xff1a;安装桌面和 VNC****第二步&#xff1a;进行一次性配置****第三步&#xff1a;日常启动与使用**AutoDL 3D 图形桌面搭建教程 目标: 在你的 AutoDL 环境上&#xff0c;以最少的步骤搭建一…

CD54.【C++ Dev】vector和list的反向迭代器的实现

目录 1.反向迭代器的功能 2.算法 方法1:新写一个类用于反向迭代器 方法2:封装正向迭代器实现反向迭代器 解析operator* 正向迭代器和反向迭代器的关系 返回 *--tmp的原因 3.为自制的vector和list编写反向迭代器 编写统一的反向迭代器 修改vector头文件 修改list头文…

如何解决pip安装报错ModuleNotFoundError: No module named ‘django’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘django’问题 摘要 在日常 Django 项目开发中&#xff0c;最常见的“拦路虎”之一就是 ModuleNotFoundError: No module named django。该异常通常在以下场景出…

单页面和多页面的区别和优缺点

单页面应用&#xff08;SPA&#xff09;与多页面应用&#xff08;MPA&#xff09;的区别单页面应用&#xff08;SPA&#xff09;整个应用只有一个HTML文件&#xff0c;内容通过JavaScript动态加载和渲染。页面切换时无需重新加载整个页面&#xff0c;仅更新部分DOM。依赖前端框…

暑期自学嵌入式——Day05(C语言阶段)

接续上文&#xff1a;暑期自学嵌入式——Day04&#xff08;C语言阶段&#xff09;-CSDN博客 点关注不迷路哟。你的点赞、收藏&#xff0c;一键三连&#xff0c;是我持续更新的动力哟&#xff01;&#xff01;&#xff01; 主页&#xff1a; 一位搞嵌入式的 genius-CSDN博客 …

通用人工智能AGI遥遥无期,面临幻灭

通用人工智能AGI有可能2080年前也实现不了 首先说一下&#xff0c;目前的人工智能方向是错的&#xff0c;通用人工智能不值得追捧。 真的特别无奈&#xff0c;现在还有很多人在吹AI&#xff0c;说什么2027年就能实现AGI&#xff0c;如果你指的是真正的强人工智能AGI&#xff0c…

智能体开发工具链全景图:IDE、调试器与监控平台

智能体开发工具链全景图&#xff1a;IDE、调试器与监控平台 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…

三十四、【扩展工具篇】JSON 格式化与解析:集成 Monaco Editor 打造在线 JSON 工具

三十四、【扩展工具篇】JSON 格式化与解析:集成 Monaco Editor 打造在线 JSON 工具 前言 功能概览 技术选型 实现步骤 第一步:添加路由和侧边栏菜单入口 第二步:创建 JSON 工具页面 第三部分:全面测试与验证 总结 前言 在日常的接口开发和测试中,我们经常需要处理 JSON 数…