在从django-rest-framwork 0.3.2转换为lates 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)
现在我已经按照教程看了你如何做到这一点(甚至可能更漂亮)。通过在网址中使用slug。
然而......我想让后端兼容客户端软件......所以我希望在没有将查询的值放在url中的情况下这样做。客户端在帖子的标题中使用json数据和ContentType json。
在django rest framwork的第一个版本中,我甚至有一个很好的可浏览形式,可以填写此查询的值
我的问题:如何在最新版本中完成此操作?
我似乎无法在视图中获得一个表单....我可以填写值并在过程中使用
也许很好发布我已经尝试过的东西直到发牢骚......
首先我在Serializer中更改了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)
注意:基于接受的答案(汤姆克里斯蒂),我也给出了一个答案,其中我展示了我如何使其工作(更详细)。
答案 0 :(得分:2)
当您从APIView
继承时,可浏览的API呈现器无法知道您要在HTML中使用哪个序列化程序,因此它可以回退到允许您发布普通JSON(或无论如何表示。
如果您继承自GenericAPIView
,请使用serializer_class
属性设置序列化程序,并使用get_serializer(...)
方法获取序列化程序的实例 - see here,然后可浏览的API将使用表单来显示用户输入。
答案 1 :(得分:0)
根据汤姆克里斯蒂的答案(我接受作为答案)。我得到了它的工作:
我制作了一个额外的序列化程序,它定义了要显示的字段以填充帖子并使用GenericAPIView显示...(如果我错了Tom,请更正我,只是在这里为其他人记录它...所以更好地说它是正确的)
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。