【问题标题】:Django class based post-only view基于 Django 类的 post-only 视图
【发布时间】:2016-08-19 23:14:20
【问题描述】:

对不起,如果这是一个微不足道的问题,但我已经搜索了很长时间,但一直找不到一个好的实现。

谁能提供一个示例,说明如何通过子类化任何通用视图在 Django 中实现仅发布视图(可以处理文件上传)?

我想创建一个端点来处理所有博客文章评论创建逻辑。评论表单嵌入在我的博客页面中,因此,此数据将作为 POST 发送到 url。

【问题讨论】:

    标签: django django-views django-class-based-views


    【解决方案1】:

    我想这样的事情应该可行:

    class TestView(View):
    
        def post(self, request):
            return HttpResponse('This is a post only view')
    

    如果您使用 Django Rest Framework,您也可以使用 CreateAPIView 来执行此操作 http://www.django-rest-framework.org/api-guide/generic-views/#createapiview

    用于仅创建端点。

    提供一个 post 方法处理程序。

    【讨论】:

    • 这假设正在使用 DRF
    • 我猜必须有办法自己做到这一点。我对一切都使用普通视图。对一个特定视图使用 DRF 似乎有点过头了。
    • @Sayse 是的,它假设使用了 DRF。我已经编辑了答案
    【解决方案2】:

    你可以试试这样的:

    class MyView(TemplateView):
        template_name = 'my_template.html'
    
        def post(self, request, **kwargs):
            my_data = request.POST
            # do something with your data
            context = {}  #  set your context
            return super(TemplateView, self).render_to_response(context)
    

    【讨论】:

    • 我用它来避免在具有批量功能(删除、存档)的表中使用表单集。更简单、更清洁。
    【解决方案3】:

    来自docs

    dispatch 查看请求以确定它是 GET、POST 等,并将请求中继到匹配的方法如果定义了一个,或者引发 HttpResponseNotAllowed

    因此,基本上,您创建的任何基于类的视图都只定义了 POST 方法,将只允许 POST 请求。

    【讨论】:

      【解决方案4】:

      View 类有一个http_method_names 属性,该属性列出了视图将接受的 HTTP 方法。

      因此,您可以对任何您喜欢的通用视图进行子类化(例如,CreateView),并设置http_method_names 以便只允许 POST 请求。

      from django.views.generic.edit import CreateView
      
      
      class CommentCreateView(CreateView):
          http_method_names = ['post']
          model = Comment
          ...
      

      或者,您可以继承 View,并编写自己的 post 方法。

      class CommentView(View):
      
          def post(self, request):
              ...
      

      在这种情况下,GET 请求将返回 HttpResponseNotAllowed 响应,因为您尚未定义 get 方法来处理 GET 请求。

      【讨论】:

        【解决方案5】:

        有一个内置的装饰器:require_POST()。更一般地,您可以使用require_http_methods()

        对于基于函数的视图(从文档中复制):

        from django.views.decorators.http import require_http_methods
        
        @require_http_methods(["GET", "POST"])
        def my_view(request):
            # I can assume now that only GET or POST requests make it this far
            # ...
            pass
        

        对于基于类的视图:

        from django.utils.decorators import method_decorator
        from django.views.decorators.http import require_http_methods
        
        @method_decorator(require_http_methods(["GET", "POST"]), name='dispatch')
        class MyView(View):
            # I can assume now that only GET or POST requests make it this far
            # ...
            pass
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-16
          • 2018-05-14
          • 2014-02-21
          • 2011-11-15
          • 1970-01-01
          • 2016-05-20
          • 1970-01-01
          相关资源
          最近更新 更多