3、视图和模板

续上一篇,这一篇 着重于创建公共接口——“视图”

第三部分——3、视图和模板

  • 1、概述
  • 2、编写更多视图
      • 原理——django依次访问了什么文件
  • 3、写一个真正有用的视图
    • 一个快捷函数 render() render——渲染
  • 4、抛出404错误
    • 一个快捷函数 get_object_or_404()
  • 5、使用模板系统
  • 6、去除模板中的硬编码URL
  • 7、为URL名称添加命名空间

1、概述

  • Django中视图——一类具有相同功能和模板网页的集合
  • 网页和其他内容由视图派生而来。
  • 视图是一个python函数or方法
  • 根据用户请求的URL(域名之后的部分)来选择使用哪个视图
  • 将URL与视图关联起来——URLconfs(将URL映射到视图)来配置

2、编写更多视图

在 polls/views 增加

def detail(request,question_id):return HttpResponse("You're loooking at question %s." % question_id)def results(request,question_id):response="You're looking at the results of question & s"return  HttpResponse(response % question_id)def vote(request,question_id):return HttpResponse("You're voting on question %s." % question_id)

将视图添加进 polls/urls 模块中

urlpatterns=[path("",views.index,name="index"),path("<int:question_id>/",views.detail,name="detail"),path("<int:question_id>/results/",views.results,name="results"),path("<int:question_id>/vote/",views.vote,name="vote"),
]

接下来访问“/polls/34/”它将运行detail()函数,显示为:
在这里插入图片描述
同理访问“/polls/2/results/”,或者访问“/polls/2/vote/”:将看到:
在这里插入图片描述
在这里插入图片描述

原理——django依次访问了什么文件

  1. 访问根urls.py文件,即ROOT_URLCONF,按顺序遍历这些模式,匹配path(“polls/”,include(“polls.urls”)),并将剩余的文本发送给polls.urls在这里插入图片描述
  2. Django 会匹配 path(‘int:question_id/’, views.detail, name=‘detail’),其中 ‘int:question_id/’ 表示将URL路径的这一部分解析为整数,并作为 question_id 参数传递给 detail 视图函数。在这里插入图片描述
  3. 在polls/views,detail 函数接收两个参数:request 和 question_id。当你访问 /polls/34/ 时,question_id 的值为 34,因此视图函数会返回包含 “You’re looking at question 34.” 的响应。

总结:
1、Django加载项目的URL配置:mysite/urls.py。
2、匹配到包含的应用URL配置:polls/urls.py。
3、解析URL路径参数并调用相应视图函数:将 question_id 解析为 34,并调用 detail 视图函数。
4、视图函数处理请求并返回响应:detail 函数生成并返回响应。

3、写一个真正有用的视图

视图必须做的只有两件事:返回一个包含被请求页面的HttpResponse对象。或者抛出一个异常。

视图还可以做什么?视图可以从数据库读记录,可以使用一个模板引擎,,可以生成一个pdf文件,可以输出一个xml,可以创建一个zip文件,可以做任何你想做的事情。

接下来修改polls/views/index()函数,显示最近的五个问题

def index(request):latest_question_list=Question.objects.order_by("-pub_date")[:5]output=",".join([q.question_text for q in latest_question_list])return HttpResponse(output)

在这里插入图片描述

  • 这里有一个问题,页面的代码写死在了视图函数里,这里解释一下什么叫“写死”,以及它的弊端

当我们说页面的设计“写死”在视图函数里时,意思是视图函数中包含了生成页面内容的具体代码。如果你想修改页面的外观或布局,就必须直接编辑这些视图函数。这种做法的问题在于:
1、难以维护和更新:每次需要修改页面的外观或布局时,都必须直接更改视图函数中的代码,可能导致代码变得复杂和难以维护。
2、代码与内容耦合:视图函数不仅负责处理请求逻辑,还负责生成HTML内容,使得业务逻辑和页面设计耦合在一起
3、复用性差:如果不同的视图函数需要共享相同的HTML结构或样式,每个视图函数都必须重复相同的HTML代码,导致代码重复和不易复用。

所以要使用Django的模板系统,只需要创建一个视图,就可以将页面的设计从代码里分离出来

首先,创建polls/templates目录。Django会在这个目录里查找模板文件

接着创建templates/polls/index.html

  • 避免模板文件名称冲突,我们应该将模板文件放在与应用同名的子文件夹中。这样做的好处是,如果你有多个应用程序,它们可以使用相同名称的模板文件而不会互相冲突
  • 命名空间:为了帮助Django区分不同应用的模板,我们将模板文件放在与应用同名的子文件夹中。这就是所谓的命名空间。例如,对于 polls 应用,我们应该在 polls/templates 目录下再创建一个 polls 子目录。

在index.html文件中:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Polls Index</title>
</head>
<body>{% if latest_question_list %}<ul>{% for question in latest_question_list %}<li><a href="/polls/{{question.id}}/">{{question.question_text}}</a></li>{% endfor %}</ul>
{% else %}<p>No polls are available.</p>
{% endif %}
</body>
</html>
<ul>:表示无序列表(unordered list)。通常用于列出项目,每个项目由 <li>(列表项)标签表示。<li>:表示列表中的项目(list item)。在无序列表 <ul> 或有序列表 <ol> 中使用。<a>:表示超链接(anchor)。用于创建链接,可以导航到其他页面或资源。href 属性指定链接目标。<p>:表示段落(paragraph)。用于定义文档中的段落,浏览器会自动在段落前后添加一些空白,以便段落与其他内容分开。{{ }}:Django模板语法,用于输出变量的值。例如,{{ question.id }} 输出问题的ID,{{ question.question_text }} 输出问题的文本。{% %}:Django模板标签,用于执行逻辑语句或控制流。例如,{% if latest_question_list %} 检查 latest_question_list 是否有数据,{% for question in latest_question_list %} 循环遍历 latest_question_list 中的每个问题,{% endif %} 结束 if 语句,{% endfor %} 结束 for 循环。

接下来更新polls/views.py中的Index视图

def index(request):latest_question_list=Question.objects.order_by("-pub_date")[:5]template= loader.get_template("polls/index.html")context={"latest_question_list": latest_question_list,}return HttpResponse(template.render(context,request))#模板渲染

一个快捷函数 render() render——渲染

载入模板,填充上下文,再返回由它生成的HttpResponse对象
这是一个非常常见的操作流程,于是Django提供了一个快捷函数,我们用它来重写index()视图

def index(request):latest_question_list=Question.objects.order_by("-pub_date")[:5]context={"latest_question_list": latest_question_list,}return render(request,"polls/index.html",context)

此时,就不再需要导入loader和HttpResponse啦

4、抛出404错误

接下来我们来处理 投票详情页面——它会显示指定投票的问题标题

from django.http import Http404
def detail(request,question_id):try:question=Question.objects.get(pk=question_id)except Question.DoesNotExist:#当指定问题ID所对应的问题不存在,这个视图就会抛出一个Http404错误raise Http404("Question does not exist")return render(request,"polls/detail.html",{"question":question})

一个快捷函数 get_object_or_404()

尝试用get函数来获取一个对象,如果不存在就抛出一个404错误
这是一个普遍的流程,Django也提供了一个快捷的函数,下面是修改的detail代码

from django.shortcuts import get_object_or_404
def detail(request,question_id):question=get_object_or_404(Question,pk=question_id)return render(request,"polls/detail.html",{"question":question})

使用辅助函数 get_object_or_404,而不是自己捕获ObjectDoesNotExist异常?为什么模型API不直接抛出ObjectDoesNotExist,而是抛出Http404呢?
这样会增加 模型层 和 视图层 的 耦合性。但是指导Django设计的最重要的思想之一就是要 保证松散耦合。yi==一些受控的耦合会被包含在django.shortcuts模块中。

5、使用模板系统

在 polls/detail.html 中:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Polls Details</title>
</head>
<body><h1>{{question.question_text}}</h1><ul>{% for choice in question.choice_set.all %}<li>{{ choice.choice_text }}</li>{% endfor %}</ul>
</body>
</html>

6、去除模板中的硬编码URL

在polls/index.html 中编写投票链接时,链接是硬编码

 <li><a href="/polls/{{question.id}}/">{{question.question_text}}</a></li>

这种 硬编码、强耦合的方法的问题在于,在具有大量模板的项目中更改url变得更有挑战性。还记得在polls/urls模块中,path()函数中定义了name参数,你可以通过使用
{% url %} 模板标签来消除对url配置中定义的特定的URL路径的依赖
将其修改为:

<li><a href="{% url"detail"question.id %}">{{question.question_text}}</a></li>

回忆一下在polls.urls中:
在这里插入图片描述
如果你想改变投票详情页面的url 比如想改成polls/specifics/12/,你不需要在模板里(包括其他模板),只要在polls/urls.py里稍微修改一下就行:

path("specifics/<int:question_id>/",views.detail,name="detail"),

此时访问http://127.0.0.1:8000/polls/specifics/2/将看到
在这里插入图片描述

7、为URL名称添加命名空间

本教程中只有一个应用:polls,在实际中可能会有好几十个应用。那么如果两个应用出现重名的url时,Django怎么分辨呢?比如,polls应用有detail视图,另一个博客应用也有detail视图,Django如何知道 {% url %} 到底对应的是哪个应用呢,需要在两个地方做出声明:
1、在polls.urls中设置命名空间:
在这里插入图片描述
2、在模板标签处(index.html/a href)添加声明
在这里插入图片描述

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

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

相关文章

实时数仓和离线数仓的区别是什么,企业该如何选择合适的数仓架构?

目录 一、离线数仓 1. 离线数仓是什么&#xff1f; 2. 离线数仓的特点 3. 离线数仓的适用场景 二、实时数仓 1. 实时数仓是什么&#xff1f; 2. 实时数仓的特点 3. 实时数仓的适用场景 三、由数仓需求变化带来的数据仓库架构的演变 1. 传统数仓架构 2. 离线大数据架构 3. Lambd…

高级IO_多路转接之ET模式Reactor

文章目录 Reactor是什么&#xff1f;LT模式 VS ET模式 示例代码 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 Reactor是什么&#xff1f; Reactor模式是一种事件驱动的并发模型&#xff0c;它通过将事件处理逻辑与事件分发机制解耦&#xff0c;实现…

maven如何处理依赖冲突的问题?

Maven是一个强大的Java项目管理工具&#xff0c;它使用一个名为pom.xml的文件来管理项目的构建过程和依赖关系。当项目中出现依赖冲突时&#xff0c;Maven使用一系列策略来解决这些问题。以下是Maven处理依赖冲突的一些常见方法&#xff1a; 1. 最近优先策略&#xff1a; -…

tensorflow之欠拟合与过拟合,正则化缓解

过拟合泛化性弱 欠拟合解决方法&#xff1a; 增加输入特征项 增加网络参数 减少正则化参数 过拟合的解决方法&#xff1a; 数据清洗 增大训练集 采用正则化 增大正则化参数 正则化缓解过拟合 正则化在损失函数中引入模型复杂度指标&#xff0c;利用给w增加权重&#xff0c;…

点线面推进未来智造

如今&#xff0c;宁波拥有门类齐全的制造业体系&#xff0c;形成了以石油化工、汽车及零部件、电工电器、纺织服装等为支柱的产业集群。 宁波工业的发展并非一蹴而就&#xff0c;蓝卓总经理谭彰详细解读了宁波制造业的发展历程与当下目标&#xff0c;从工业小市到工业大市、工业…

基于Matlab和Python泰勒图的绘制

一、泰勒图介绍 泰勒图:泰勒图1常用于评价模型的精度,常用的精度指标有相关系数,标准差以及均方根误差(RMSE)。一般而言,泰勒图中的散点代表模型,辐射线代表相关系数,横纵轴代表标准差,而虚线代表均方根误差。泰勒图一改以往用散点图这种只能呈现两个指标来表示模型精度…

Qt使用笔记1(智能指针,deleteLater,多屏)

1、Qt智能指针 1.1、QPointer &#xff1a;解决野指针问题&#xff0c;必须是QObject对象。 1.2、QScopedPoint&#xff1a;作用域指针&#xff0c;出作用域自动释放。 1.3、QScopedArrayPoint&#xff1a;作用域数组指针&#xff0c;出作用域自动释放数组。 1.4、QSharedP…

RedHat运维-Ansible自动化运维基础20-从ansible-galaxy下载role

1. 社区管理的role仓库&#xff1a;___________________________________&#xff1b; 2. 社区管理的role仓库&#xff1a;___________________________________&#xff1b; 3. 社区管理的role仓库&#xff1a;___________________________________&#xff1b; 4. 在ansible …

Python数据结构的库之Fuk使用详解

概要 fuk 是一个用于处理 Python 数据结构的库,全称为 "Fast and Uncomplicated Kit"。它提供了一系列高效、简洁的数据结构实现,以及对 Python 内置数据结构的扩展。通过使用 fuk,开发者可以更加方便地处理列表、集合、字典等数据类型,提高代码的执行效率和可读…

vite+vue3拍照上传到nodejs服务器

一:效果展示: 拍照效果 二:Nodejs后端接口代码: 三:前端完整代码:

Vue基础--v-model/v-for/事件属性/侦听器

目录 一 v-model表单元素 1.1 v-model绑定文本域的value 1.1.1 lazy属性&#xff1a;光标离开再发请求 1.1.2 number属性&#xff1a;如果能转成number就会转成numer类型 1.1.3 trim属性&#xff1a;去文本域输入的前后空格 1.2v-model绑定单选checkbox 1.3代码展示 二 …

esp8266+micropython+irsend红外发射调试记录

在网上搜索esp8266micropython的红外发射库&#xff0c;没找到&#xff0c;发现 接收库是有的&#xff0c;可以参考&#xff1a;基于MicroPython的ESP8266连接外设IO&#xff08;二&#xff09;_micropython 红外接收-CSDN博客 可惜没有发射&#xff0c;很不方便。 这里都有介…

PHP财务记账管理系统小程序源码

理财小能手必备&#xff01;揭秘财务记账管理系统的魔力✨ &#x1f31f; 引入篇&#xff1a;告别糊涂账&#xff0c;拥抱财务自由 你是否曾为月底的账单头疼不已&#xff1f;是否觉得自己的钱总是莫名其妙地消失&#xff1f;别担心&#xff0c;财务记账管理系统来拯救你的钱…

【机器学习】必会数学知识:一文掌握数据科学核心数学知识点(下),收藏~

核心数学知识点 1、引言2、数据科学必会数学知识2.13 K均值聚类2.14 决策树2.15 随机森林2.16 梯度下降2.17 随机梯度下降&#xff08;SGD&#xff09;2.18 卷积2.19 拉普拉斯变换2.20 傅里叶变换2.21 信息论2.22 时间序列分析2.23 生成模型与判别模型2.24 支持向量机&#xff…

git merge 分支回退

1. 使用git merge --abort&#xff08;如果合并正在进行中&#xff09; git merge --abort2. 使用git reset&#xff08;合并已经提交&#xff09; 硬重置&#xff08;--hard&#xff09;会丢弃所有合并后的更改&#xff0c;并将HEAD指向合并前的提交。这是最彻底的方式&…

DDOS 攻击原理

DDoS攻击的基本原理 资源耗尽&#xff1a;攻击者通过发送大量的请求或数据包&#xff0c;耗尽目标系统的资源&#xff08;如带宽、CPU、内存等&#xff09;&#xff0c;使其无法处理正常的用户请求。 分布式攻击&#xff1a;与传统的DoS&#xff08;拒绝服务&#xff09;攻击不…

Java-面向对象基础

在面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;中&#xff0c;类&#xff08;Class&#xff09;是一种用来描述对象共同特征的蓝图或模板。它是创建对象的原型&#xff0c;定义了对象可以有的属性&#xff08;字段&#xff09;和行为&#xff08;方法…

物联网应用,了解一点 WWAN全球网络标准

WWAN/蜂窝无线电认证&#xff0c;对跨地区应用场景&#xff0c;特别重要。跟随全球业务的脚步&#xff0c;我们像大唐先辈一样走遍全球业务的时候&#xff0c;了解一点全球化的 知识信息&#xff0c;就显得有那么点意义。 NA &#xff08;北美&#xff09;&#xff1a;美国和加…

OpenSSH漏洞(CVE-2024-6387)

漏洞信息 请参考:OpenSSH远程代码执行漏洞 (CVE-2024-6387) 影响范围 8.5p1 <= OpenSSH < 9.8p1 参考链接中内容补充 利用方式 关于OpenSSH漏洞CVE-2024-6387,攻击者可以利用一个有用的代码路径并在正确的时间点上被SIGALRM信号打断,从而导致sshd(OpenSSH守护…

基于Python的哔哩哔哩数据分析系统设计实现过程,技术使用flask、MySQL、echarts,前端使用Layui

背景和意义 随着互联网和数字媒体行业的快速发展&#xff0c;视频网站作为重要的内容传播平台之一&#xff0c;用户量和内容丰富度呈现爆发式增长。本研究旨在设计并实现一种基于Python的哔哩哔哩数据分析系统&#xff0c;采用Flask框架、MySQL数据库以及echarts数据可视化技术…