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でスラッグを使用する。

ただし....クライアント側ソフトウェアの下位互換性を維持したいので、URLにクエリの値を入れずにこれを持ちたいです。クライアント側は、投稿のヘッダーで json データと ContentType json を使用します。

django Rest Framework の最初のバージョンでは、このクエリの値を入力するための見栄えの良い閲覧可能なフォームさえ取得しました。

私の質問: 最新バージョンでこれを行うにはどうすればよいですか?

ビューでフォームを取得できないようです....値を入力してプロセスで使用できる場所

ソファまで試したことを投稿するのは良いかもしれません...

まず、シリアライザーで 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)

注:受け入れられた回答(Tom Christieによる)に基づいて、どのように機能したかを示す回答を追加しました(詳細)。

4

2 に答える 2

2

から継承している場合APIView、ブラウズ可能な API レンダラーは、HTML で表示するために使用するシリアライザーを知る方法がないため、プレーンな JSON (またはその他の) 表現を投稿できるようにフォールバックします。

代わりに から継承しGenericAPIView、属性を使用してシリアライザーを設定し、メソッドを使用してシリアライザーserializer_classのインスタンスを取得する場合 (こちらを参照)、ブラウズ可能な API はフォームを使用してユーザー入力を表示します。get_serializer(...)

于 2012-12-16T14:48:07.763 に答える
0

Tom Christie の回答に基づいています (回答として受け入れます)。私はそれを働かせました:

投稿に入力するために表示されるフィールドを定義し、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 クラスを Form として悪用しているような気がします。

于 2012-12-16T22:50:00.193 に答える