如何向Django休息框架提交包含ajax图像的表单?

时间:2015-03-30 20:17:27

标签: jquery ajax django django-rest-framework

你能发现我做错了什么吗?

这是Form(在模板标签中创建):

@register.simple_tag(takes_context=True)
def add_picture_upload(context,textarea_id):
  a = """<form style="display:none; visibility:hidden;" id="add_image_form" action="/fotos/upload/" method="post" enctype="multipart/form-data" >""" 
  b = """</form>"""
  form = PictureForm()
  return a+str(form)+b

这里是在提交时调用的javascript:

function html_add_image(event) {
  event.stopPropagation(); // Stop stuff happening
  event.preventDefault(); // Totally stop stuff happening
  var data_dict = new FormData($(this)[0]);
  var req = api_create("pictures", data_dict);
  req.done(function(data) {
    alert(data);
  })
}

这里是ajax请求:

function api_create(content_name, data_dict) {
  var req = $.ajax({
      url: '/api/'+content_name+'/',
      contentType:"application/json",
      dataType: "json",
      data: data_dict,
      processData: false,
      type: 'POST'
  }).fail(function(jqXHR, status, err){
    // fail
  })
  return req;
}

它给了我:

  

详细信息:“JSON解析错误 - 'utf8'编解码器无法解码字节0xff   位置148:无效的起始字节“

或者如果我JSON.stringify数据而不是我得到:

  

image_field:[“没有提交文件。”]

您有任何建议或网站有一个有效的例子吗?我知道很多人都在努力解决这个问题,但这里所有其他问题并没有真正引领任何问题。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

与流行的看法相反,it's not possible使用JSON上传文件,以便Django可以识别它们而不会乱砍它们。这是因为JSON does not natively support file uploads,所以你必须自己处理文件序列化和上传。

但你有几个选择

  • 处理文件上传与元数据分开。这需要文件和元数据的单独端点,类似于Dropbox对separating file uploadsthe metadata所做的操作。
  • Base64会在您上传文件时对文件进行编码,并使用自定义Base64FileField来处理这些文件。 drf-extras提供了可以使用的Base64ImageField