django rest框架3 ImageField发送ajax结果“未提交文件”。

and*_*_07 5 python django ajax

我在Django Rest Framework中有一个API端点可以上传图像。您能发现我做错了什么吗?

#models.py

class test(models.Model):
    ...
    upload_path = 'upload/'
    image = models.ImageField(upload_to=upload_path, null=True, blank=True)
    ...
Run Code Online (Sandbox Code Playgroud)

#serializers.py

class TestSerializer(serializers.ModelSerializer):
    image = serializers.ImageField(
        max_length=None, use_url=True,
    )
    class Meta:
        model = test
        fields = ('id','name','image',...)
Run Code Online (Sandbox Code Playgroud)

#views.py

@api_view(['GET', 'POST'])
def test_list(request, site_id, block_id):

            ....

        if request.method == 'POST':
            serializer = TestSerializer(data=request.DATA)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            else:
                return Response(
                    serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    else :
        return Response(status=status.HTTP_403_FORBIDDEN)
Run Code Online (Sandbox Code Playgroud)

#js

function setimage() {
    var $input = $("#js_teaser_img");
    var fd = new FormData;

    fd.append('image', $input.prop('files')[0]);

    $.ajax({
        url: '/api/....',
        data: fd,
        processData: false,
        contentType: false,
        type: 'POST',
        success: function (data) {
            alert(data);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

结果图像:[“未提交文件。”] 0:“未提交文件。”

结果

Django REST Framework上传图片:“提交的数据不是文件”

+

var reader = new FileReader();  
        reader.onload = function(e) {
            var img_local = e.target.result;
            $('.js_img_src').attr('src', img_local);
            $.post('/api/..../7/', {'image':img_local} , function( data ) {
                console.log(data);
            });
        }
        reader.readAsDataURL(file);
Run Code Online (Sandbox Code Playgroud)

dav*_*ode 2

为了从客户端发送文件,您应该使用“ multipart/form-data”(jQuery默认设置contentType为“ ”)。application/x-www-form-urlencoded阅读这个问题:Sending multipart/formdata with jQuery.ajax

关于 python 和 django Rest 框架,您应该在 API 视图中使用MultiPartParserand/orFileUploadParser并且文件上传的首选方法应该是“ put”,正如您在此处的参考中看到的:http://www.django-rest-framework .org/api-guide/parsers/#fileuploadparser

附:如果您使用 django 休息框架,我强烈鼓励您使用 Angular 而不是 jQuery,因为它为休息服务提供了出色的集成...相信我会更好!;)