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)添加声明
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kvm图形化管理工具virt-manager安装

1、Virt-manager简介 Virt-manager是一个桌面用户界面&#xff0c;用于通过libvirt管理虚拟机。它主要针对KVM虚拟机&#xff0c;但也管理Xen和LXC&#xff08;linux容器&#xff09;。它提供了运行域、它们的实时性能和资源利用率统计信息的摘要视图。向导可以创建新域&#…

MFC扩展库BCGControlBar Pro v35.0 - 可视化管理主题等全新升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.0已全新发布了&#xff0c;这个版本改进类Visual Studio 2022的视觉主题、增强对多个…

camera-qsc-crosstalk校准数据XTALK回写

问题背景 手机越做越紧凑&#xff0c;需要模组和芯片尺寸越做越小&#xff0c;在尺寸一定的基础上&#xff0c;高像素和大像素&#xff0c;对于手机摄像头来说&#xff0c;一直是一对矛盾的存在。 高像素&#xff1a;带来高分辨率画质大像素&#xff1a;带来暗态下高感光度和…

【MyBatis】——入门基础知识必会内容

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

Covalent Network(CXT)通过社区投票将代币迁移并更名为 CXT,以推动人工智能更深层次的创新

专注于人工智能和 Web3 的模块化数据基础设施 Covalent Network&#xff08;CXT&#xff09;宣布&#xff0c;其治理提案已通过社区投票并顺利实施&#xff0c;即将原生代币 CQT 迁移为新的 CXT 代币&#xff0c;并部署至新的合约。这一关键性转变标志着 Covalent Network&…

Android焦点之InputWindows的更新(一)

找到焦点窗口后&#xff0c;回到DisplayContent的updateFocusedWindowLocked方法中继续往下走 执行到此处会进行InputWindows的更新 InputMonitor#setInputFocusLw&#xff1a;以上过程伴随日志&#xff1a;WindowManager: Input focus has changed to Window{a44139a u0 Noti…

linux系统中SPI驱动框架以及代码的详解

大家好,今天给大家分享一下,如何使用SPI子系统,详细实现以及具体的操作方法。 第一:SPI驱动框架模板 参考内核头文件:include\linux\spi\spi.h。 1、SPI平台总线设备驱动模型 Linux驱动程序开始基于“平台总线设备驱动模型”,将驱动程序分为两块: * 左边注册一个platfo…

算法力扣刷题记录 四十一【N叉树遍历】

前言 依然是遍历问题。由二叉树扩展到N叉树遍历。 记录 四十一【N叉树遍历】 一、【589. N叉树的前序遍历】 题目 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔…

FLinkCDC引起的生产事故(二)

背景&#xff1a; 最近在做实时数据的抽取工作&#xff0c;利用FLinkCDC实时抽取目标库Oracle的数据到Doris中&#xff0c;但是在抽取的过程中&#xff0c;会导致目标库的生产库数据库非常卡顿&#xff0c;为了避免对生产环境的数据库造成影响&#xff0c;对生产环境的数据库利…

Android 自定义Edittext 和TextView 提示文字和填入内容不同的粗细组件

近期项目中又EditText 以及TextView 这两个组件需要用到提示文字 以及 填入文字要保持不同的粗细程度,所以记录一下 首先 是EditText 组件的自定义 BLEditText 继承的这个组件是一个三方的组件,可以在很大程度上减少drawable的编写,有兴趣的可以去相关的Git去看一下 点击查看,…

Redis 主从复制,集群与高可用

虽然Redis可以实现单机的数据持久化&#xff0c;但无论是RDB也好或者AOF也好&#xff0c;都解决不了单点宕机问题&#xff0c;即一旦单台 redis服务器本身出现系统故障、硬件故障等问题后&#xff0c;就会直接造成数据的丢失 此外,单机的性能也是有极限的,因此需要使用另外的技…

合合信息大模型加速器亮相WAIC大会:文档解析与文本识别新突破

合合信息大模型加速器亮相WAIC大会&#xff1a;文档解析与文本识别新突破 文章目录 合合信息大模型加速器亮相WAIC大会&#xff1a;文档解析与文本识别新突破前言合合信息TextIn平台&#xff1a;智能文档处理的领军者文档解析引擎&#xff1a;百页文档秒级处理大模型的发展背景…

TortoiseSVN-VisualSVNServer-软件代码文本资源版本控制管理-版本比较及差异文件

文章目录 1.VisualSVNServer安装2.TortoiseSVN安装2.1.检出2.2.提交资源2.3.更新资源2.4.返回版本2.5.比较软件可更改2.6.在此创建版本库3.TortoiseSVN版本差异文件1.VisualSVNServer安装 从官网下载,或者csdn下载链接: https://download.csdn.net/download/m0_67316550/8952…

C语言笔记32 •单链表经典算法OJ题-4.查找链表的中间结点•

1.问题 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 2.代码实现&#xff08;快慢指针&#xff09; //4.查找链表的中间结点 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #in…

Win11系统文件夹预览无法预览PDF文件,PDF阅读器是adobe acrobat

三步走 首先&#xff0c;打开文件夹预览功能 然后&#xff0c;设置adobe acrobat为默认PDF打开应用 最后&#xff0c;打开在Windows资源管理器中启用PDF缩略图&#xff0c;正常设定后&#xff0c;会显示配置文件&#xff0c;稍等一会。

防火墙练习实验

一、实验拓扑 二、实验要求 1、DMZ区内的服务器&#xff0c;办公区仅能在办公时间内9&#xff1a;00-18&#xff1a;00&#xff09;可以访问&#xff0c;生产区的设备全天可以访问&#xff1b; 2、生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网&#xff1…

git查看版本,查看安装路径、更新版本

git version 查看版本 git update-git-for-windows 更新版本 git version 查看版本

顶顶通呼叫中心中间件实现随时启动和停止质检(mod_cti基于FreeSWITCH)

文章目录 前言联系我们拨号方案启动停止ASR执行FreeSWITCH 命令接口启动ASR接口停止ASR接口 通知配置cti.json配置质检结果写入数据库 前言 顶顶通呼叫中心中间件的实时质检功能是由两个模块组成&#xff1a;mod_asr 和 mod_qc。 mod_asr&#xff1a;负责调用ASR将用户们在通…

beyond Compare连接 openWrt 和 VsCode

连接步骤总结 1. 新建会话 -> 文件夹比较 2.点击浏览文件夹 3.在弹出页面 配置 ftp 3.1&#xff09;选中ftp 配置文件 3.2)选中ssh2 3.3)填写我们需要远端连接的主机信息 先点击连接并浏览 得到下方文件夹 弹出无效登录&#xff0c;说明需要密码 我们返回右键刚刚创建的新 …

旷野之间12 - 内容创作用的最佳大模型评测

​​​​​​ 我正在做一个项目,需要我找出最适合内容创作的 LLM。我查看了 lmsys 排行榜上的顶级模型,阅读了其他人对这些模型的评价,查看了顶级 LLM 的模型卡,在没有明确答案后,我决定对所有这些 LLM 进行测试,以完成不同的内容创作任务。 评估模型 我想要评估的模型…