【问题标题】:Django REST Framework not generating form in Browsable APIDjango REST Framework 未在可浏览 API 中生成表单
【发布时间】:2016-03-24 10:56:02
【问题描述】:

好的,我有一个 GenericAPIView,它应该在 Browsable API 中生成一个表单,因为它声明了一个 post 方法:

from rest_framework import status
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response

from transacciones.serializers import BillSerializer


class ProcessBill(GenericAPIView):

    serializer_class = BillSerializer

    def post(self, request):

        recieved_data = request.data

        print(recieved_data)

        return Response("Processed Bill", status=status.HTTP_200_OK)

但它不会生成表单。视图看起来像这样(它是西班牙语,我将代码翻译成英文,这样阅读起来更舒服):

我知道我得到了 405 Method not Allowed,因为我没有定义 get 方法,只定义了 post。

我正在使用 Django 1.8、Django REST Framework 3.3.1 和 python 3.4。我在这里迷路了。有任何想法吗?

编辑

另外,如果我使用 Postman(Chrome 插件),视图会正确响应。

【问题讨论】:

  • @Geotob 本题使用GenericAPIView,旧题使用APIView。 TomChristie 对这个问题的回答中说明了差异:stackoverflow.com/questions/14616489/…
  • 无论如何我认为创建一个新问题可能是个好主意,也许这不是一个好主意。我可以删除其中一个。
  • 对不起,我没有发现这个! :( GenericAPIViews 使用 create(request, *args, **kwargs) 方法,而不是 post
  • @Geotob 尝试了 create 方法,不起作用。无论如何,GenericAPIView 是从 APIView 扩展而来的,这就是文档所说的......所以它应该有一个 post 方法。

标签: django django-rest-framework


【解决方案1】:

如果您使用generics.RetrieveUpdateDestroyAPIView,那么您必须定义可以自定义的权限类。

class ObjectDetail(generics.RetrieveUpdateDestroyAPIView):
    """
    Object RUD (Read Update Delete) API
    """
    permission_classes = ( checkUserPermission, )
    queryset = Object.objects.all()
    serializer_class = ObjectSerializer

或者如果你只想测试这个,使用permission_classes = ( AllowAny, )

class ObjectDetail(generics.RetrieveUpdateDestroyAPIView):
    """
    Object RUD (Read Update Delete) API
    """
    permission_classes = ( AllowAny, )
    queryset = Object.objects.all()
    serializer_class = ObjectSerializer

【讨论】:

    【解决方案2】:

    你可以用这个

    from rest_framework.generics import CreateAPIView
    from rest_framework.mixins import CreateModelMixin
    from rest_framework.response import Response
    
    from transacciones.serializers import BillSerializer
    
    
    class ProcessBill(CreateModelMixin, GenericAPIView):
        serializer_class = BillSerializer
    
        def post(self, request, *args, **kwargs):
            return self.create(request, *args, **kwargs)
    
        def create(self, request, *args, **kwargs):
            # Do whatever you want here
    
            # Then invoke the create method and create your instance
            return super().create(request, *args, **kwargs)
    

    或者作为替代方案,您只需从 CreateAPIView 继承,它与上面的代码基本相同 :)

    【讨论】:

    • 嗯是的@alejoss 我没有注意到泛型需要post 方法.. 太习惯于视图集。学到了一些新东西:)看上面的编辑,对我来说很好
    【解决方案3】:

    我遇到了同样的问题,我看到邮递员是凭据问题,因此将当前用户状态更改为员工解决了问题。

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题。就我而言,错误出在序列化程序中,我使用了django.db.models.CharField(...) 而不是rest_framework.serializers.CharField(...)。

      【讨论】:

        猜你喜欢
        • 2013-01-15
        • 2013-12-27
        • 2016-08-01
        • 2016-03-31
        • 1970-01-01
        • 2016-01-31
        • 2015-04-28
        • 2013-09-20
        • 2016-03-24
        相关资源
        最近更新 更多