基于类的通用视图 Django(创建、检索、更新、删除)
Django 是一个基于 Python 的 Web 框架,可让您快速创建 Web 应用程序。它具有内置的管理界面,可以轻松使用它。它通常被称为包含电池的框架,因为它为每个功能提供了内置设施。基于类的通用视图是一组先进的内置视图,用于实现选择性视图策略,例如创建、检索、更新、删除。基于类的视图通过分离视图的 GET、POST 请求来简化使用。它们不会取代基于函数的视图,但与基于函数的视图相比,它们具有一定的区别和优势:
- 与特定 HTTP 方法(GET、POST 等)相关的代码组织可以通过单独的方法而不是条件分支来解决。
- 诸如混合(多重继承)之类的面向对象技术可用于将代码分解为可重用的组件。
本文围绕Django 中基于类的视图的完整实现(创建、检索、更新、删除)。让我们讨论一下 CRUD 的真正含义,
CreateView – 在数据库的表中创建或添加新条目。
检索视图——读取、检索、搜索或以列表形式查看现有条目( ListView )或详细检索特定条目( DetailView )
UpdateView – 更新或编辑数据库表中的现有条目
DeleteView – 删除、停用或移除数据库表中的现有条目
FormView – 将表单呈现为模板并处理用户输入的数据
Django CRUD(创建、检索、更新、删除)基于类的视图
如何使用示例创建和使用 CRUD 视图的说明。考虑一个名为 geeksforgeeks 的项目,它有一个名为 geeks 的应用程序。
Refer to the following articles to check how to create a project and an app in Django.
- How to Create a Basic Project using MVT in Django?
- How to Create an App in Django ?
在你有一个项目和一个应用程序之后,让我们创建一个模型,我们将通过我们的视图创建它的实例。在 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
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
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
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
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
让我们检查一下 http://localhost:8000/ 上有什么
要检查基于类的 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/ 上有什么
要检查基于类的 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/ 上有什么
要检查基于类的 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
让我们检查一下 http://localhost:8000/1/update/ 上有什么
要检查基于类的 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
让我们检查一下 http://localhost:8000/1/delete 上有什么
要检查基于类的 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
在 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/,
要检查基于类的 FormView 的完整实现,请访问 FormView – 基于类的视图 Django