如何在 Django 基于类的视图中有效使用 PUT 和 DELETE HTTP 方法?

问题描述 投票:0回答:1

我正在使用 Django 设置 CRUD 系统,使用基于类的视图。目前我正在尝试弄清楚如何在我的应用程序中处理 HTTP PUT 和 DELETE 请求。尽管广泛搜索了 Django 文档,但我很难找到具体的示例和清晰的解释来说明如何将这些类型的查询提交到基于类的视图。

我创建了一个名为CategoryView的视图类,扩展自:

django.views.View
,在其中我成功实现了get和post方法。我想像这样构建我的网址:

  1. 新类别:127.0.0.1:8000/backendapp/categories/create
  2. 列出所有类别:127.0.0.1:8000/backendapp/categories/
  3. 仅检索一个类别:127.0.0.1:8000/backendapp/categories/1
  4. 等等...

但是,当我尝试实现 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 应用程序中的资源,以及演示其用法的实际示例。但是,我还没有找到可行的解决方案,现在正在寻求社区的帮助来克服这个困难。

python django http crud django-class-based-views
1个回答
0
投票

请注意,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
    
© www.soinside.com 2019 - 2024. All rights reserved.