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

Unable to make POST request using AJAX, but can do so through the browsable API when using Django Rest Framework

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

我的序列化器class如下:

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 class 时,jsonData 字段默认使用 CharField 作为 SerializerField

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

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

我更新了 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'))

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

错误在 ajax() 方法调用中,contentType 属性 未正确设置。当使用框架提供的通用视图时,DRF 会自动选择合适的解析器。它通过查看正在设置的 content-type header 来做到这一点,这是通过设置 contentType 属性 来完成的。