基于类的通用视图Django(创建,检索,更新,删除)

2021年3月19日18:22:04 发表评论 693 次浏览

Django是一个基于Python的Web框架, 可让你快速创建Web应用程序。它具有内置的管理界面, 使其易于使用。通常被称为电池包括框架因为它为每种功能提供了内置功能。基于类的通用视图是内置视图的高级集合, 用于实现选择性视图策略(如创建, 检索, 更新, 删除)。基于类的视图通过分离视图的GET, POST请求来简化使用。它们不能代替基于功能的视图, 但是与基于功能的视图相比具有某些区别和优点:

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

本文围绕完全实现Django中基于类的视图(创建, 检索, 更新, 删除)。让我们讨论一下CRUD的实际含义,

无标题图316

创建视图

–在数据库的表中创建或添加新条目。

检索视图

–以列表形式读取, 检索, 搜索或查看现有条目(

列表显示

)或详细检索特定条目(

详细视图

)

更新视图

–更新或编辑数据库表中的现有条目

删除视图

–删除, 停用或删除数据库表中的现有条目

表格浏览

–将表单呈现为模板并处理用户输入的数据

Django CRUD(创建, 检索, 更新, 删除)基于类的视图

的插图如何创建和使用CRUD视图用一个例子。考虑一个名为极客有一个名为极客.

请参阅以下文章, 以检查如何在Django中创建项目和应用。如何在Django中使用MVT创建基本项目?如何在Django中创建应用程序?

在拥有一个项目和一个应用程序之后, 让我们创建一个模型, 我们将通过我们的视图创建该模型。在怪胎/models.py,

# 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

现在, 我们将为此模型创建一个Django ModelForm。请参阅本文以获取更多有关modelform的信息–Django ModelForm –从模型创建表单。创建一个文件表格在极客文件夹中,

from django import forms
from .models import GeeksModel
  
  
# creating a form
class GeeksForm(forms.ModelForm):
  
     # create meta class
     class Meta:
         # specify model to be used
         model = GeeksModel
  
         # specify fields to be used
         fields = [
             "title" , "description" , ]

使用基于类的视图

从本质上讲, 基于类的视图使你可以使用不同的类实例方法来响应不同的HTTP请求方法, 而不是使用单个视图函数中的有条件分支代码。

因此, 在视图函数中用于处理HTTP GET的代码将如下所示:

from django.http import HttpResponse
  
def my_view(request):
     if request.method = = 'GET' :
         # <view logic>
         return HttpResponse( 'result' )

在基于类的视图中, 这将变为:

from django.http import HttpResponse
from django.views import View
  
class MyView(View):
     def get( self , request):
         # <view logic>
         return HttpResponse( 'result' )

同样在urls.py, 一个需要使用as_view()从基于函数的视图区分基于类的视图的方法。

# urls.py
from django.urls import path
from myapp.views import MyView
  
urlpatterns = [
  
     path( 'about/' , MyView.as_view()), ]

创建视图

创建视图是指在数据库中创建表实例的视图(逻辑)。我们已经在"创建视图-基于函数的视图Django"中讨论了创建视图的基础。基于类的视图会自动设置从A到Z的所有内容。只需指定要为其创建创建视图的模型和字段。然后基于Class的CreateView将自动尝试在其中查找模板app_name / modelname_form.html。在我们的情况下是geeks / templates / geeks / geeksmodel_form.html。让我们创建基于类的视图。在geeks / views.py,

from django.views.generic.edit import CreateView
from .models import GeeksModel
  
class GeeksCreate(CreateView):
  
     # specify the model for create view
     model = GeeksModel
  
     # specify the fields to be displayed
  
     fields = [ 'title' , 'description' ]

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

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

在中创建模板template / geeks / geeksmodel_form.html,

< form method = "POST" enctype = "multipart/form-data" >
  
     <!-- Security token -->
     {% csrf_token %}
  
     <!-- Using the formset -->
     {{ form.as_p }}
      
     < input type = "submit" value = "Submit" >
</ form >

让我们检查一下

http://本地主机:8000 /

基于Django创建视图功能

要检查基于Class的CreateView的完整实现, 请访问

Createview –基于类的视图Django

.

检索视图

列表显示

列表视图是指用于显示数据库中表的多个实例的视图(逻辑)。我们已经在中讨论了列表视图的基础列表视图–基于函数的视图Django。基于类的视图会自动设置从A到Z的所有内容。只需指定要为其创建ListView的模型, 然后基于类的ListView将自动尝试在其中找到模板app_name / modelname_list.html。在我们的情况下是geeks / templates / geeks / geeksmodel_list.html。让我们创建基于类的视图。在geeks / views.py,

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中,

from django.urls import path
  
# importing views from views..py
from .views import GeeksList
urlpatterns = [
     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://本地主机:8000 /

django-listview-class-based-views

要检查基于Class的ListView的完整实现, 请访问

ListView –基于类的视图Django

详细视图

详细视图是指一种视图(逻辑), 用于显示数据库中表的一个实例。我们已经在中讨论了细节视图的基础细节视图–基于函数的视图Django。基于类的视图会自动设置从A到Z的所有内容。只需指定要为其创建DetailView的模型, 然后基于类的DetailView将自动尝试在其中查找模板。app_name / modelname_detail.html。在我们的情况下是geeks / templates / geeks / geeksmodel_detail.html。让我们创建基于类的视图。在geeks / views.py,

from django.views.generic.detail import DetailView
  
from .models import GeeksModel
  
class GeeksDetailView(DetailView):
     # specify the model to use
     model = GeeksModel

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

from django.urls import path
  
# importing views from views..py
from .views import GeeksDetailView
urlpatterns = [
     # <pk> is identification for id field, # slug can also be used
     path( '<pk>/' , GeeksDetailView.as_view()), ]

在中创建模板templates / geeks / geeksmodel_detail.html,

< h1 >{{ object.title }}</ h1 >
< p >{{ object.description }}</ p >

让我们检查一下

http://本地主机:8000/1 /

基于django-detailview-class

要检查基于Class的DetailView的完整实现, 请访问

DetailView –基于类的视图Django

更新视图

UpdateView引用一个视图(逻辑)以使用一些额外的细节来更新数据库中表的特定实例。它用于更新数据库中的小肠, 例如, 更新lsbin上的文章。我们已经在中讨论了更新视图的基础更新视图–基于函数的视图Django。基于类的视图会自动设置从A到Z的所有内容。只需要指定要为其创建UpdateView的模型, 然后基于类的UpdateView就会自动尝试在其中找到模板app_name / modelname_form.html。在我们的情况下是geeks / templates / geeks / geeksmodel_form.html。让我们创建基于类的视图。在geeks / views.py,

# import generic UpdateView
from django.views.generic.edit import UpdateView
  
# Relative import of GeeksModel
from .models import GeeksModel
  
class GeeksUpdateView(UpdateView):
     # specify the model you want to use
     model = GeeksModel
  
     # specify the fields
     fields = [
         "title" , "description"
     ]
  
     # can specify success url
     # url to redirect after successfully
     # updating details
     success_url = "/"

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

from django.urls import path
  
# importing views from views..py
from .views import GeeksUpdateView
urlpatterns = [
     # <pk> is identification for id field, # <slug> can also be used
     path( '<pk>/update' , GeeksUpdateView.as_view()), ]

在中创建模板template / geeks / geeksmodel_form.html,

< form method = "post" >
     {% csrf_token %}
     {{ form.as_p }}
     < input type = "submit" value = "Save" >
</ form >

让我们检查一下

http:// localhost:8000/1 / update /

django-updateview-class-based-view

要检查基于Class的UpdateView的完整实现, 请访问UpdateView –基于类的视图Django.

删除视图

删除视图是指从数据库中删除表的特定实例的视图(逻辑)。它用于删除数据库中的小肠, 例如, 删除lsbin上的文章。我们已经在中讨论了删除视图的基础删除视图–基于函数的视图Django。基于类的视图会自动设置从A到Z的所有内容。只需指定要为其创建DeleteView的模型, 然后基于类的DeleteViewde就会自动尝试在其中找到模板app_name / modelname_confirm_delete.html。在我们的情况下是geeks / templates / geeks / geeksmodel_confirm_delete.html。让我们创建基于类的视图。在geeks / views.py,

# import generic UpdateView
from django.views.generic.edit import DeleteView
  
# Relative import of GeeksModel
from .models import GeeksModel
  
class GeeksDeleteView(DeleteView):
     # specify the model you want to use
     model = GeeksModel
      
     # can specify success url
     # url to redirect after successfully
     # deleting object
     success_url = "/"

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

from django.urls import path
  
# importing views from views..py
from .views import GeeksDeleteView
urlpatterns = [
     # <pk> is identification for id field, # slug can also be used
     path( '<pk>/delete/' , GeeksDeleteView.as_view()), ]

在中创建模板template / geeks / geeksmodel_confirm_delete.html,

< form method = "post" >{% csrf_token %}
     < p >Are you sure you want to delete "{{ object }}"?</ p >
     < input type = "submit" value = "Confirm" >
</ form >

让我们检查一下

http:// localhost:8000/1 /删除

django-deleteview-class-based-views

.

要检查基于Class的DeleteView的完整实现, 请访问

DeleteView –基于类的视图Django

表格浏览

FormView是指用于显示和验证Django表单的视图(逻辑)。例如, 用于在lsbin注册用户的表单。基于类的视图会自动设置从A到Z的所有内容。只需要指定为其创建FormView和template_name的表单, 然后基于类的FormView将自动呈现该表单。让我们创建基于类的视图。在geeks / views.py,

# import generic FormView
from django.views.generic.edit import FormView
  
# Relative import of GeeksForm
from .forms import GeeksForm
  
class GeeksFormView(FormView):
     # specify the Form you want to use
     form_class = GeeksForm
      
     # sepcify name of template
     template_name = "geeks / geeksmodel_form.html"
  
     # can specify success url
     # url to redirect after successfully
     # updating details
     success_url = "/thanks/"

在中为此视图创建模板geeks / geeksmodel_form.html,

< form method = "post" >
     {% csrf_token %}
     {{ form.as_p }}
     < input type = "submit" value = "Save" >
</ form >

将网址映射到怪胎/ urls.py,

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

现在访问

http://127.0.0.1:8000/

,

基于Django创建视图功能

要检查基于Class的FormView的完整实现, 请访问

FormView –基于类的视图Django

注意怪胎!巩固你的基础Python编程基础课程和学习基础知识。

首先, 你的面试准备可通过以下方式增强你的数据结构概念:Python DS课程。


木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: