我正在使用基于类的视图与Django建立一个CRUD系统.目前,我正在try 弄清楚如何在我的应用程序中处理HTTUP和RST请求.尽管广泛搜索了Django文档,但我很难找到如何将这些类型的查询提交到基于类的视图的具体示例和清晰解释.

我创建了一个名为ClassoryView的视图类,从: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. 等等

然而,当我try 实现put和select方法时,我陷入了困境.

例如:


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请求的示例和教程.我还try 将put和select方法添加到我的ClassoryView视图类中,但没有成功.我希望找到清楚地解释如何将这些查询集成到我的Django应用程序中的资源,以及演示它们使用的实际示例.然而,我还没有找到可行的解决方案,现在正在寻求社区帮助来克服这个困难.

推荐答案

小心HTML does not support PUT, PATCH, DELETE个"开箱即用".您可以使用AJax,但<form method="delete">不起作用,仅仅是因为浏览器没有发出收件箱请求.因此,您需要AJax来发出请求.

另一个问题是路由:您的视图位于categories/之后,因此您将在那里发出PUTPATCH等请求.因此,您需要定义multiple个视图,每个视图都处理其中的一部分,例如:

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 framework [drf-doc]中的ModelViewSet(或ViewSet)来制作此类API.这还提供了serializers,它通常使请求数据和模型对象之间的映射以及从模型对象到响应数据的映射更容易,并与路由一起工作,从而可以正确地路由项.

因此,我们可以通过以下方式实现该目标:

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确定的not,但每个方法顶部的 comments 就是SimpleRouter [drf-doc]如何做到这一点.因此,您可以通过以下方式注册ViewSet:

from rest_framework import routers

router = routers.SimpleRouter()
router.register('categories', MyCategoryViewSet)
urlpatterns = router.urls

Python相关问答推荐

GL pygame无法让缓冲区与vertextPointer和colorPointer一起可靠地工作

如何使用pandasDataFrames和scipy高度优化相关性计算

如何避免Chained when/then分配中的Mypy不兼容类型警告?

如何根据参数推断对象的返回类型?

沿着数组中的轴计算真实条目

如何在虚拟Python环境中运行Python程序?

如何设置视频语言时上传到YouTube与Python API客户端

递归访问嵌套字典中的元素值

Python逻辑操作作为Pandas中的条件

dask无groupby(ddf. agg([min,max])?''''

如何排除prefecture_related中查询集为空的实例?

处理Gekko的非最优解

如何在Python Pandas中填充外部连接后的列中填充DDL值

不允许 Select 北极滚动?

判断Python操作:如何从字面上得到所有decorator ?

如何求相邻对序列中元素 Select 的最小代价

如何使用pytest在traceback中找到特定的异常

Polars表达式无法访问中间列创建表达式

替换包含Python DataFrame中的值的<;

如何通过特定导入在类中执行Python代码