0

在从 django-rest-framwork 0.3.2 转换到最新的 2.1.9 时解决了我的一些麻烦后,我看不到修复这个问题(我同意 Reinout 的博客...... ..)

我有这个代码:

class ApiSomeInputView(View):
    form = ApiSomeForm
    permissions = (IsAuthenticated, )
    resource=SomeResource


    def get(self, request):
        """
        Handle GET requests.
        """
        return "Error: No GET request Possible, use post"

    def post(self, request, format=None):
        some_thing =   self.CONTENT['some_thing']
        # check if something exist:
        something = get_object_or_none(Something,some_field=int(some_thing))
        if not something:
            raise _404_SOMETHING_NOT_FOUND
        #Note exludes are set in SomeResource
        data = Serializer(depth=4).serialize(something)
        return Response(status.HTTP_200_OK, data)

现在,我已经按照教程进行操作,并了解了如何做到这一点(甚至更漂亮)。通过在 url 中使用 slug。

但是......我想让客户端软件向后兼容......所以我想拥有这个而不将查询的值放在url中。客户端在帖子的标题中使用 json 数据和 ContentType json。

在 django rest 框架的第一个版本中,我什至得到了一个不错的可浏览表单,用于填写此查询的值

我的问题:如何在最新版本中完成这项工作?

我似乎无法在视图中获得表格......我可以在其中填写值并在过程中使用

也许很好地发布我到目前为止所尝试的内容......

首先,我在序列化器中更改了 ModelResource:

class SomethingSerializer(HyperlinkedModelSerializer):
    class Meta:
        model = Something
        #exclude = ('id',)
        depth = 4

然后视图更改为:

class ApiSomeInputView(APIView):
    permissions = (IsAuthenticated, )

    def post(self, request, format=None):
        some_thing = request.DATA['some_thing']
        # check if something exist: .... well actually this above already does not work
        something = get_object_or_none(Something,some_field=int(some_thing))
        if not something:
            raise _404_SOMETHING_NOT_FOUND
        serializer = SomethingSerializer(something)
        return Response(status.HTTP_200_OK, serializer.data)

注意:基于接受的答案(汤姆克里斯蒂),我也提出了一个答案,我展示了我是如何工作的(更详细)。

4

2 回答 2

2

当您从 继承时APIView,可浏览的 API 渲染器无法知道您要使用什么序列化器在 HTML 中呈现,因此它回退到允许您发布纯 JSON(或其他)表示。

如果您改为从 继承GenericAPIView,使用属性设置序列化程序,并使用该方法serializer_class获取序列化程序的实例-请参见此处,那么可浏览 API 将使用表单来显示用户输入。get_serializer(...)

于 2012-12-16T14:48:07.763 回答
0

基于汤姆克里斯蒂的回答(我会接受作为答案)。我让它工作:

我制作了一个额外的序列化程序,它定义了要显示的字段以填写帖子并使用 GenericAPIView 显示......(如果我错了汤姆,请纠正我,只是在这里为其他人记录......所以最好说它正确)

class SomethingSerializerForm(Serializer):
    some_thing = serializers.IntegerField()

有了这个序列化程序和我已经拥有的另一个序列化程序。

还有一个观点:

class ApiSomeInputView(GenericAPIView):
    permissions = (IsAuthenticated, )
    model = Something
    serializer_class = SomethingSerializerForm

    def post(self, request, *args, **kwargs):
         serializer = self.get_serializer(data=request.DATA)
         if not serializer.is_valid():
             raise ParseError(detail="No valid values")
         some_thing = request.DATA['some_thing']
         something = get_object_or_none(Something,some_field=int(some_thing))
         if not something:
             raise Http404
         serializer = SomethingSerializer(something)
         return Response(serializer.data)

以上工作正常,与以前完全相同....

我仍然觉得我在滥用 Serializer 类作为表单。

于 2012-12-16T22:50:00.193 回答