📜  Django 中的视图 | Python

📅  最后修改于: 2022-05-13 01:54:40.395000             🧑  作者: Mango

Django 中的视图 | Python

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-views

Django 查看示例

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

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

Python3
# import Http Response from django
from django.http import HttpResponse
# get datetime
import datetime
 
# create a function
def geeks_view(request):
    # fetch date and time
    now = datetime.datetime.now()
    # convert to string
    html = "Time is {}".format(now)
    # return response
    return HttpResponse(html)


Python3
from django.urls import path
 
# importing views from views..py
from .views import geeks_view
 
urlpatterns = [
    path('', geeks_view),
]


Python3
# import the standard Django Model
# from built-in library
from django.db import models
  
# declare a new model with a name "GeeksModel"
class GeeksModel(models.Model):
 
    # fields of the model
    title = models.CharField(max_length = 200)
    description = models.TextField()
 
    # renames the instances of the model
    # with their title name
    def __str__(self):
        return self.title


Python3
from django.contrib import admin
from .models import GeeksModel
# Register your models here.
admin.site.register(GeeksModel)


Python3
from django.shortcuts import render
 
# relative import of forms
from .models import GeeksModel
 
 
def list_view(request):
    # dictionary for initial data with
    # field names as keys
    context ={}
 
    # add the dictionary during initialization
    context["dataset"] = GeeksModel.objects.all()
         
    return render(request, "list_view.html", context)


html
      {% for data in dataset %}.       {{ data.title }}
    {{ data.description }}
    
      {% endfor %}  


Python3
from django.views.generic.list import ListView
from .models import GeeksModel
 
class GeeksList(ListView):
 
    # specify the model for list view
    model = GeeksModel


Python3
from django.urls import path
 
# importing views from views..py
from .views import GeeksList
urlpatterns = [
    path('', GeeksList.as_view()),
]


html
             {% for object in object_list %}          
  • {{ object.title }}
  •     
  • {{ object.description }}
  •       
             {% empty %}     
  • No objects yet.
  •     {% endfor %}


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

  • 首先,我们从 django.http 模块导入类HttpResponse以及 Python 的 datetime 库。
  • 接下来,我们定义一个名为 geeks_view 的函数。这是视图函数。每个视图函数都将一个 HttpRequest 对象作为其第一个参数,通常命名为 request。
  • 该视图返回一个 HttpResponse 对象,其中包含生成的响应。每个视图函数负责返回一个HttpResponse对象。

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

Python3

from django.urls import path
 
# importing views from views..py
from .views import geeks_view
 
urlpatterns = [
    path('', geeks_view),
]

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

django-view-示例

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

视图类型

Django 视图分为两大类:-

  • 基于函数的视图
  • 基于类的视图

django-views-types

基于函数的视图

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

基于函数的视图示例 –

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

Python3

# import the standard Django Model
# from built-in library
from django.db import models
  
# declare a new model with a name "GeeksModel"
class GeeksModel(models.Model):
 
    # fields of the model
    title = models.CharField(max_length = 200)
    description = models.TextField()
 
    # renames the instances of the model
    # with their title name
    def __str__(self):
        return self.title

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

Python manage.py makemigrations
Python 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 中,

Python3

from django.contrib import admin
from .models import GeeksModel
# Register your models here.
admin.site.register(GeeksModel)

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

django-listview-check-models-instances

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

Python3

from django.shortcuts import render
 
# relative import of forms
from .models import GeeksModel
 
 
def list_view(request):
    # dictionary for initial data with
    # field names as keys
    context ={}
 
    # add the dictionary during initialization
    context["dataset"] = GeeksModel.objects.all()
         
    return render(request, "list_view.html", context)

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

html

      {% for data in dataset %}.       {{ data.title }}
    {{ data.description }}
    
      {% endfor %}  

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

django-listview-function-based

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

基于类的视图

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

  • 与特定 HTTP 方法(GET、POST 等)相关的代码组织可以通过单独的方法而不是条件分支来解决。
  • 诸如混合(多重继承)之类的面向对象技术可用于将代码分解为可重用的组件。

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

基于类的视图示例 –

在 geeks/views.py 中,

Python3

from django.views.generic.list import ListView
from .models import GeeksModel
 
class GeeksList(ListView):
 
    # specify the model for list view
    model = GeeksModel

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

Python3

from django.urls import path
 
# importing views from views..py
from .views import GeeksList
urlpatterns = [
    path('', GeeksList.as_view()),
]

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

html

             {% for object in object_list %}          
  • {{ object.title }}
  •     
  • {{ object.description }}
  •       
             {% empty %}     
  • No objects yet.
  •     {% endfor %}

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

django-listview-class-based-views

Django CRUD(创建、检索、更新、删除)基于类的通用视图:-

  • CreateView – 基于类的视图 Django
  • DetailView – 基于类的视图 Django
  • UpdateView – 基于类的视图 Django
  • DeleteView – 基于类的视图 Django
  • FormView – 基于类的视图 Django