我正在使用 Django 设置 CRUD 系统,使用基于类的视图。目前我正在尝试弄清楚如何在我的应用程序中处理 HTTP PUT 和 DELETE 请求。尽管广泛搜索了 Django 文档,但我很难找到具体的示例和清晰的解释来说明如何将这些类型的查询提交到基于类的视图。
我创建了一个名为CategoryView的视图类,扩展自:
django.views.View
,在其中我成功实现了get和post方法。我想像这样构建我的网址:
但是,当我尝试实现 put 和 delete 方法时,我陷入了困境。
例如:
from django.views import View
class CategoryView(View):
template_name = 'backendapp/pages/category/categories.html'
def get(self, request):
categories = Category.objects.all()
context = {
'categories': categories
}
return render(request, self.template_name, context)
def post(self, request):
return
def delete(self, request, pk):
return
def put(self, request):
return
我通读了 Django 文档,发现基于类的视图支持 HTTP 请求:
["get", "post", "put", "patch", "delete", "head ", "options", "trace"]
。
链接:https://docs.djangoproject.com/en/5.0/ref/class-based-views/base/#django.views.generic.base.View
尽管如此,我还是不知道该怎么做。
所以我请求您帮助解除对我的封锁。
我查看了 Django 文档,并在线搜索了有关在基于类的视图中处理 HTTP 请求的示例和教程。我还尝试尝试将 put 和 delete 方法添加到我的 CategoryView 视图类中,但没有成功。我希望找到能够清楚解释如何将这些查询集成到我的 Django 应用程序中的资源,以及演示其用法的实际示例。但是,我还没有找到可行的解决方案,现在正在寻求社区的帮助来克服这个困难。
请注意,HTML 不支持“开箱即用”的 PUT、PATCH、DELETE。您可以使用 AJAX,但是 <form method="delete">
不起作用,只是因为浏览器没有发出 DELETE 请求。所以你需要 AJAX 来发出请求。另一个问题是路由:你的视图位于
categories/
后面,所以这就是你发出
PUT
、
PATCH
等请求的地方。因此,您需要定义多个视图,每个视图都处理它的一部分,例如:
from django.urls import path
urlpatterns = [
path('categories/', MyListlikeCategoryView.as_view()),
path('categories/<int:pk>/', MyObjectlikeCategoryView.as_view()),
path('categories/create/', MyCreateCategoryView.as_view()),
]
然后在这些单独的视图中,实现适用的方法:
class MyListlikeCategoryView(View):
# list of categories
def get(self, request):
# …
pass
class MyObjectlikeCategoryView(View):
# put new object
def put(self, request, pk):
# …
pass
# update object
def patch(self, request, pk):
# …
pass
# delete object
def delete(self, request, pk):
# …
pass
class MyCreateCategoryView(View):
# create object
def post(self, request):
# …
pass
但无论如何,Django 并不是为创建 (CRUD) API 而设计的。您可以使用来自 Django REST 框架
[drf-doc]的
ModelViewSet
(或 ViewSet
)来制作此类 API。这还提供了序列化器,通常可以使请求数据和模型对象之间以及从模型对象到响应数据之间的映射变得更容易,并与路由器一起使用,从而可以正确路由项目。
因此我们可以这样实现:
class MyCategoryViewSet(viewsets.ViewSet):
# GET /categories/
def list(self, request):
# …
pass
# POST /categories/
def create(self, request):
# …
pass
# GET /categories/1/
def retrieve(self, request, pk=None):
# …
pass
# PUT /categories/1/
def update(self, request, pk=None):
# …
pass
# PATCH /categories/1/
def partial_update(self, request, pk=None):
# …
pass
# DELETE /categories/1/
def destroy(self, request, pk=None):
# …
pass
路径不是由ViewSet
决定,每个方法顶部的注释只是
SimpleRouter
[drf-doc]将如何做到这一点。因此,您可以将 ViewSet
注册为:
from rest_framework import routers
router = routers.SimpleRouter()
router.register('categories', MyCategoryViewSet)
urlpatterns = router.urls