写点什么

Django 中的视图 | Python

  • 2022 年 6 月 16 日
  • 本文字数:2644 字

    阅读完需:约 9 分钟

Django Views 是 M V T Structure of Django 的重要参与者之一。根据 Django 文档,视图函数是接受 Web 请求并返回 Web 响应的 Python 函数。此响应可以是网页的 HTML 内容、重定向、404 错误、XML 文档或图像,以及 Web 浏览器可以显示的任何内容。 


Django 视图是用户界面的一部分——它们通常将模板文件中的 HTML/CSS/Javascript 渲染成您在渲染网页时在浏览器中看到的内容。(请注意,如果您使用过其他基于 MVC (Model-View-Controller)的框架,请不要混淆 Django 视图和 MVC 范例中的视图。Django 视图大致对应于 MVC 中的控制器,而 Django 模板对应于视图在 MVC 中。)



Django 查看示例


如何使用示例创建和使用 Django 视图的说明。考虑一个名为 geeksforgeeks 的项目,它有一个名为 geeks 的应用程序。 


准备好项目后,我们可以在 geeks/views.py 中创建一个视图,


# 从 django 导入 Http 响应from django.http import HttpResponse# 获取日期时间import datetime
# 创建一个函数def geeks_view(request): # 获取日期和时间 now = datetime.datetime.now() # 转换为字符串 html = "Time is {}".format(now) # 返回响应 return HttpResponse(html)
复制代码


让我们一次一行地浏览这段代码: 

  • 首先,我们从 django.http 模块导入类 HttpResponse 以及 Python 的 datetime 库。

  • 接下来,我们定义一个名为 geeks_view 的函数。这是视图功能。每个视图函数都将一个 HttpRequest 对象作为其第一个参数,通常命名为 request。

  • 该视图返回一个 HttpResponse 对象,其中包含生成的响应。每个视图函数负责返回一个 HttpResponse 对象。

有关 HttpRequest 和 HttpResponse 的更多信息,请访问 - Django 请求和响应周期 - HttpRequest 和 HttpResponse 对象让我们在 geeks/urls.py 中让这个视图正常工作,


from django.urls import path
# importing views from views..pyfrom .views import geeks_view
urlpatterns = [ path('', geeks_view),]
复制代码


现在,访问http://127.0.0.1:8000/



要查看如何使用 Django 的 MVT(模型、视图、模板)结构制作基本项目,请访问如何在 Django 中使用 MVT 创建基本项目?

视图类型

Django 视图分为两大类:-

  • 基于函数的视图

  • 基于类的视图


基于函数的视图

基于函数的视图是使用 python 中的函数的编写器,该函数接收作为参数 HttpRequest 对象并返回一个 HttpResponse 对象。基于函数的视图一般分为 4 种基本策略,即 CRUD(创建、检索、更新、删除)。CRUD 是任何用于开发的框架的基础。  

基于函数的视图示例 –

让我们创建一个基于函数的视图列表视图来显示模型的实例。让我们创建一个模型,我们将通过我们的视图创建它的实例。在 geeks/models.py 中,


# 从内置库中导入标准 Django 模型from django.db import models
# 声明一个名为“GeeksModel”的新模型class GeeksModel(models.Model):
# 模型字段 title = models.CharField(max_length = 200) description = models.TextField()
# 用标题名称重命名模型的实例 def __str__(self): return self.title
复制代码


创建此模型后,我们需要运行两个命令才能为其创建数据库。


Python manage.py makemigrationsPython manage.py migrate
复制代码


现在让我们使用 shell 创建这个模型的一些实例,运行表单 bash,


Python manage.py shell
复制代码


输入以下命令


>>> from geeks.models import GeeksModel>>> GeeksModel.objects.create(                       title="title1",                       description="description1").save()>>> GeeksModel.objects.create(                       title="title2",                       description="description2").save()>>> GeeksModel.objects.create(                       title="title2",                       description="description2").save()
复制代码


现在,如果您想在管理面板中查看您的模型及其数据,那么您需要注册您的模型。让我们注册这个模型。在 geeks/admin.py 中,


from django.contrib import adminfrom .models import GeeksModel# Register your models here.admin.site.register(GeeksModel)
复制代码


现在我们已经为后端准备好了一切。验证是否已从http://localhost:8000/admin/geeks/geeksmodel/ 创建实例



让我们为其创建一个视图和模板。在 geeks/views.py 中,


from django.shortcuts import render
# 表格的相对导入from .models import GeeksModel

def list_view(request): # 以字段名称为键的初始数据字典 context ={}
# 在初始化期间添加字典 context["dataset"] = GeeksModel.objects.all() return render(request, "list_view.html", context)
复制代码


在 templates/list_view.html 中创建模板,


<div class="main">
{% for data in dataset %}.
{{ data.title }}<br/> {{ data.description }}<br/> <hr/>
{% endfor %}
</div>
复制代码


让我们检查一下http://localhost:8000/上有什么



类似地,基于函数的视图可以用创建、更新、检索和删除视图的逻辑来实现。


基于类的视图

基于类的视图提供了另一种将视图实现为 Python 对象而不是函数的方法。它们不会取代基于函数的视图,但与基于函数的视图相比,它们具有一定的区别和优势: 

  • 与特定 HTTP 方法(GET、POST 等)相关的代码组织可以通过单独的方法而不是条件分支来解决。

  • 诸如混合(多重继承)之类的面向对象技术可用于将代码分解为可重用的组件。

基于类的视图比基于函数的视图更易于管理且更高效。具有大量代码行的基于函数的视图可以转换为仅具有几行代码的基于类的视图。这就是面向对象编程产生影响的地方。  

基于类的视图示例 –

在 geeks/views.py 中,


from django.views.generic.list import ListViewfrom .models import GeeksModel
class GeeksList(ListView):
# 指定列表视图的模型 model = GeeksModel
复制代码


现在创建一个 URL 路径来映射视图。在 geeks/urls.py 中,


from django.urls import path
# importing views from views..pyfrom .views import GeeksListurlpatterns = [ path('', GeeksList.as_view()),]
复制代码


在 templates/geeks/geeksmodel_list.html 中创建一个模板,


<ul>	<!-- Iterate over object_list -->	{% for object in object_list %}	<!-- Display Objects -->	<li>{{ object.title }}</li>	<li>{{ object.description }}</li>
<hr/> <!-- If objet_list is empty --> {% empty %} <li>No objects yet.</li> {% endfor %}</ul>
复制代码


让我们检查一下http://localhost:8000/ 上有什么



发布于: 刚刚阅读数: 4
用户头像

公众号:海拥 2021.11.29 加入

【个人网站】haiyong.site 【联系方式】微信:wh18363 【软件技能】前端,Java,Python 【个人称号】InfoQ 写作社区签约作者,华为云享专家,CSDN原力作者,全栈领域优质创作者,掘金2021年度人气作者No.21

评论

发布
暂无评论
Django 中的视图 | Python_Python_海拥(haiyong.site)_InfoQ写作社区