3、视图和模板

news2024/9/28 13:19:41

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

第三部分——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.coloradmin.cn/o/1914104.html

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

相关文章

qq动态删了怎么恢复?五分钟找回您的QQ动态

在使用QQ空间时&#xff0c;我们经常会发现自己误删了一些重要的动态。这可能是由于手指滑动不慎或者误操作引起的。无论是珍贵的回忆还是重要的信息&#xff0c;一旦被删除&#xff0c;我们都希望能够找回来。那么&#xff0c;qq动态删了怎么恢复&#xff1f; 在本文中&#…

SolidWorks滚花螺栓制作-cnblog

目标 规划基准图形 确定尺寸&#xff0c;单位mm 我 对固定好的图形进行旋转 倒角 设置螺纹 注意改变深度为15mm 收尾位置补全 滚花 建立基准面 制作多边形 添加穿透 扫描切除 圆周阵列 成品完成

css看见彩虹,吃定彩虹

css彩虹 .f111 {width: 200px;height: 200px;border-radius: 50%;box-shadow: 0 0 0 5px inset red, 0 0 0 10px inset orange, 0 0 0 15px inset yellow, 0 0 0 20px inset lime, 0 0 0 25px inset aqua, 0 0 0 30px inset blue, 0 0 0 35px inset magenta;clip-path: polygo…

Html5前端基本知识整理与回顾下篇

今天我们继续结合发布的Html5基础知识点文档进行复习&#xff0c;希望对大家有所帮助。 目录 列表 无需列表 有序列表 自定义列表 样例 表格 基本属性 ​编辑 相关属性 Border Width Height ​编辑 表格标题 ​编辑 表格单元头 合并单元格 垂直单元格合并 水…

GLM4大模型微调入门实战-命名实体识别(NER)任务

[GLM4]是清华智谱团队最近开源的大语言模型。 以GLM4作为基座大模型&#xff0c;通过指令微调的方式做高精度的命名实体识别&#xff08;NER&#xff09;&#xff0c;是学习入门LLM微调、建立大模型认知的非常好的任务。 显存要求相对较高&#xff0c;需要40GB左右。 知识点1&…

将Hyper-V虚拟机与主机共享网络

Hyper-V 网络设置 目标 将Hyper-V虚拟机网络配置为与主机使用同一网络&#xff0c;并确保主机网络连接不受影响。 前提条件 主机上已安装Hyper-V已创建Hyper-V虚拟机 步骤 1. 配置主机网络共享 打开 控制面板 -> 网络和 Internet -> 网络连接。右键点击 WIAN,选择…

C++ 调用Halcon引擎,脚本调试代码

一&#xff0c;背景&#xff1a;C调用halcon最常见的方式便是转C代码&#xff0c;然后封装成函数或者类库。另外一种方式是调用Halcon脚本&#xff0c;不需要转换成C代码&#xff0c;Debug的时候&#xff0c;可以直接跳入halcon脚本&#xff0c;单步查看每一行算法执行情况&…

NSObject‘s MetaClass 的 super_class 指向谁 ?

在 Objective-C 运行时系统中&#xff0c;NSObject 是所有类的根类。为了理解 NSObject 的元类&#xff08;MetaClass&#xff09;以及它的 super_class 指针指向谁&#xff0c;我们需要理解元类的继承关系。 类和元类的关系 每个类对象都有一个 isa 指针&#xff0c;指向其元…

谷粒商城实战-25-分布式组件-SpringCloud Alibaba-Nacos配置中心-加载多配置集

文章目录 一&#xff0c;拆分配置集二&#xff0c;配置文件中配置多配置集1&#xff0c;引用多配置集2&#xff0c;验证 三&#xff0c;多配置集总结1&#xff0c;使用场景2&#xff0c;优先级 这一节介绍如何加载多个配置集。 大多数情况下&#xff0c;我们把配置全部放在一个…

【IEEE官方列表会议,EI, Scopus稳定检索】第三届半导体与电子技术国际研讨会(ISSET 2024,2024年8月23-25)

2024年第三届半导体与电子技术国际研讨会&#xff08;ISSET 2024&#xff09;将于2024年8月23-25日在中国西安举行。 ISSET 2024将围绕“半导体”与“电子技术”等相关最新研究领域&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供一…

url链接地址,#前的参数 和 #后的参数有什么区别

例如 http://localhost:8080/?beforeParams1#/workSchemelist/index?afterParams1 beforeParams 和 afterParams 区别 打印出来可以发现&#xff1a; beforeParams 是 url 的search参数&#xff0c;通过window.location.search获取 afterParams 是 route 的query参数&#…

练手项目---笔记大师

练手项目—笔记大师 项目地址 https://github.com/GXY00/NoteMaster/tree/master 给个⭐呗 项目功能实现 大部分功能已完成&#xff0c;少部分仍在学习中 主要用到的知识点&#xff1a; 开机动画&#xff1a;Timer、TimerTask登录注册功能&#xff1a;SQLitesharedPref…

力扣爆刷第162天之TOP100五连刷76-80(最小路径和、最长公共前缀、最长连续序列)

力扣爆刷第162天之TOP100五连刷76-80&#xff08;最小路径和、最长公共前缀、最长连续序列&#xff09; 文章目录 力扣爆刷第162天之TOP100五连刷76-80&#xff08;最小路径和、最长公共前缀、最长连续序列&#xff09;一、64. 最小路径和二、221. 最大正方形三、162. 寻找峰值…

UML图书管理系统用例图示例

新书速览|《UML 2.5基础、建模与设计实践》新书速览|《UML 2.5基础、建模与设计实践 【例4.4】图书管理系统用例图。 图书管理系统按其业务功能分成借阅者管理、图书管理、借书、还书和用户管理等几部分&#xff0c;这些职能对应于系统的不同组织部门。 1&#xff09;系统参…

密态计算,大模型“用数”的必由之路

文&#xff5c;白 鸽 编&#xff5c;王一粟 今年世界人工智能大会上&#xff0c;大模型如何走向深度应用成为重要议题。 但在大模型迈向深度应用的过程中&#xff0c;相比于算力的稀缺&#xff0c;“真正的问题是缺数据&#xff0c;无论是在通用技术领域&#xff0c;还是在专…

基于stm32单片机的智能手环的设计

摘 要 随着科技的飞速发展和人们生活水平的提高&#xff0c;健康与科技日益融合&#xff0c;智能可穿戴设备已成为现代人生活中不可或缺的一部分。智能手环&#xff0c;作为一种便携、实用且功能丰富的可穿戴设备&#xff0c;受到越来越多用户的喜爱。它不仅能够实时监测用户的…

鸿蒙开发:每天一个小bug----鸿蒙开发路由跳转踩坑

一、前言 报错内容显示找不到页面 &#xff0c;肯定我们页面没写对呗&#xff01; 可能是这几个原因:1.main_pages.json没配置路由 {"src": ["pages/02/UserInfoClass","pages/02/AppStorageCase02"] } 2.跳转路径没写对 错误&#xff1a;…

如何管理一百个ai专家智能体——ai调度系统设计

前言 如果你用过openai的chatgpt服务&#xff0c;你肯定知道一个叫做GPTs的智能体商店&#xff0c;里面提供了大量的来自官方和个人制作的专门针对某个领域的gpt助手。比如&#xff0c;你想让gpt帮忙写文章&#xff0c;并且要能够写得好&#xff0c;你就可以在商店中搜索相关的…

JS代码动态打印404页面源码

JS代码动态打印404页面源码&#xff0c;适合做网站错误页&#xff0c;具有js动态打印效果&#xff0c;喜欢的朋友可以拿去 源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务…

跌200万后女子要卖掉能看西湖的房子周边有完善配套

今年楼市行情不太好,很多业主都是想要将手中多余的房子出售,因为不想亏 钱了。比如这个业主陈艳也是一样的,日前其决定要将国都公寓的房子出售,然而 根据陈艳描述,这套房子最大的亮点,就是在家就可以欣赏到西湖一隅的美景。 陈艳解释,十多年前买入时,为了居住更舒适,便将…