无法使用AJAX发出POST请求,但可以在使用Django Rest Framework时通过可浏览的API执行此操作

时间:2015-02-24 11:00:15

标签: ajax django django-rest-framework

首次使用Django,我正在使用DRF构建一个简单的API,我使用的视图是框架提供的通用视图。我在我的模型中有一个JSONField,我在序列化器类中用DictField表示。使用可浏览API时,所有不同的HTTP请求都有效。我甚至可以使用JQuery对所有项目或单个项目进行GET请求,但我无法使用我在使用可浏览API进行相同请求时提供的相同数据发出请求。

我的序列化程序类如下:

class ChartsSerializer(serializers.ModelSerializer):
    jsonData = serializers.DictField()
    owner = serializers.ReadOnlyField(source='owner.username')

    class Meta:
        model = Charts
        fields = ('id', 'chartName', 'description', 'isPrivate', 'jsonData', 'owner')

默认情况下,使用ModelSerializer课程时,jsonData字段默认使用CharField作为SerializerField

可浏览API中提供的默认模板提供了一个空列表,我将其替换为对象。

Example

当使用HTML表单标签发出帖子请求时,我得到了同样的错误。

我更新了perform_create方法,以确保在调用save方法时传递给序列化程序的数据是字典。

class ChartsList(generics.ListCreateAPIView):
    queryset = Charts.objects.all()
    serializer_class = ChartsSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

    def perform_create(self, serializer):
        print(self.request.data)
        serializer.save(owner=self.request.user, \
                        jsonData=self.request.data.get('josnData'))

如果有任何错误或需要更多信息,我会提供。

1 个答案:

答案 0 :(得分:0)

错误发生在ajax()方法调用中,contentType属性未正确设置。在使用框架提供的通用视图时,DRF会自动选择要使用的正确解析器。它通过查看正在设置的content-type标头来完成此操作,这通过设置contentType属性来完成。