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

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

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

Django 是一个基于 Python 的 Web 框架,可让您快速创建 Web 应用程序。它具有内置的管理界面,可以轻松使用它。它通常被称为包含电池的框架,因为它为每个功能提供了内置设施。基于类的通用视图是一组先进的内置视图,用于实现选择性视图策略,例如创建、检索、更新、删除。基于类的视图通过分离视图的 GET、POST 请求来简化使用。它们不会取代基于函数的视图,但与基于函数的视图相比,它们具有一定的区别和优势:

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

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

Untitled-Diagram-316

CreateView – 在数据库的表中创建或添加新条目。
检索视图——读取、检索、搜索或以列表形式查看现有条目( ListView )或详细检索特定条目( DetailView
UpdateView – 更新或编辑数据库表中的现有条目
DeleteView – 删除、停用或移除数据库表中的现有条目
FormView – 将表单呈现为模板并处理用户输入的数据

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

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

在你有一个项目和一个应用程序之后,让我们创建一个模型,我们将通过我们的视图创建它的实例。在 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


Python3
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",
        ]


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


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


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


Python3
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']


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


HTML
           {% csrf_token %}            {{ form.as_p }}           


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 %}


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


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


HTML

{{ object.title }}

     

{{ object.description }}



Python3
# 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 ="/"


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


HTML
    {% csrf_token %}     {{ form.as_p }}     


Python3
# 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 ="/"


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


HTML
{% csrf_token %}          

Are you sure you want to delete "{{ object }}"?

          


Python3
# 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
     
    # specify name of template
    template_name = "geeks / geeksmodel_form.html"
 
    # can specify success url
    # url to redirect after successfully
    # updating details
    success_url ="/thanks/"


HTML
    {% csrf_token %}     {{ form.as_p }}     


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


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

Python manage.py makemigrations
Python manage.py migrate

现在我们将为这个模型创建一个 Django ModelForm。有关 modelform 的更多信息,请参阅本文 – Django ModelForm – 从模型创建表单。在 geeks 文件夹中创建文件 forms.py,

Python3

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 的代码如下所示:

Python3

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

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

Python3

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

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

Python3

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

创建视图

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

Python3

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

Python3

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

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

HTML

           {% csrf_token %}            {{ form.as_p }}           

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

django-create-view-function-based

要检查基于类的 CreateView 的完整实现,请访问 Createview – 基于类的视图 Django。

检索视图

列表显示

列表视图是指显示数据库中表的多个实例的视图(逻辑)。我们已经在 List View – 函数 based Views Django 中讨论了 List View 的基础知识。基于类的视图会自动设置从 A 到 Z 的所有内容。只需指定要为哪个模型创建 ListView,然后基于类的 ListView 将自动尝试在 app_name/modelname_list.html 中查找模板。在我们的例子中,它是 geeks/templates/geeks/geeksmodel_list.html。让我们创建基于类的视图。在 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

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

详细视图

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

Python3

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

Python3

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

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

HTML

{{ object.title }}

     

{{ object.description }}

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

django-detailview-class-based

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

更新视图

UpdateView 指的是一种视图(逻辑),用于从数据库中更新表的特定实例,并提供一些额外的细节。它用于更新数据库中的条目,例如,更新 geeksforgeeks 上的文章。我们已经在 Update View – 函数 based Views Django 中讨论了 Update View 的基础知识。基于类的视图会自动设置从 A 到 Z 的所有内容。只需指定要为哪个模型创建 UpdateView,然后基于类的 UpdateView 将自动尝试在 app_name/modelname_form.html 中查找模板。在我们的例子中,它是 geeks/templates/geeks/geeksmodel_form.html。让我们创建基于类的视图。在 geeks/views.py 中,

Python3

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

Python3

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

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

HTML

    {% csrf_token %}     {{ form.as_p }}     

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

django-updateview-class-based-view

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

删除视图

删除视图是指从数据库中删除表的特定实例的视图(逻辑)。它用于删除数据库中的条目,例如,删除 geeksforgeeks 上的文章。我们已经在 Delete View – 函数 based Views Django 中讨论了删除视图的基础知识。基于类的视图会自动设置从 A 到 Z 的所有内容。只需指定要为哪个模型创建 DeleteView,然后基于类的 DeleteViewde 将自动尝试在 app_name/modelname_confirm_delete.html 中查找模板。在我们的例子中,它是 geeks/templates/geeks/geeksmodel_confirm_delete.html。让我们创建基于类的视图。在 geeks/views.py 中,

Python3

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

Python3

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

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

HTML

{% csrf_token %}          

Are you sure you want to delete "{{ object }}"?

          

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

django-deleteview-class-based-views

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

窗体视图

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

Python3

# 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
     
    # specify 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 中为此视图创建模板,

HTML

    {% csrf_token %}     {{ form.as_p }}     

在 geeks/urls.py 中将一个 url 映射到这个视图,

Python3

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-create-view-function-based

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