我知道关于这个主题的主题并没有遗漏,这就是为什么我查看了关于这个主题的大量帖子,找不到令我满意的东西,所以我试图自己构建它.
我想要做的就是使用Djaxo使用Ajax上传文件以避免页面刷新.
这是我做的:
basic_upload.html:
<form method="post" id="creationOptionsForm" enctype="multipart/form-data"> {% csrf_token %} <div> {{ form.name.errors }} {{ form.name }} </div> <div> {{ form.email.errors }} {{ form.email }} </div> <div> {{ form.logo.errors }} {{ form.logo }} </div> <input type="submit" value="submit"> </form>
Ajax.js:
$(document).on('submit','#creationOptionsForm',function(e){ e.preventDefault(); var form_data = new FormData(); form_data.append('file',$('#creationOptionsForm').get(0).files); $.ajax({ type:'POST',url:'/designer/results/',processData: false,contentType: false,data:{ organisation:$('#id_organisation').val(),email:$('#id_email').val(),logo:form_data,csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val(),},}); });
Views.py:
def creationResult(request): if request.method == 'POST': form = UserInfos(request.POST,request.FILES) if form.is_valid(): photo = form.save() ... ...
(forms.py& urls.py配置正确,没有必要包含它们).
我想在调试(pdb)request.POST返回除logo之外的每个数据时,我对ajax.js的处理方式存在问题.
我在做什么吗?
解决方法
以下方法适用于我,它将所有表单值提交为serialize().您将在request.POST和logo request.FILES中获取所有表单输入
试试这个:
$(document).on('submit',function(e){ e.preventDefault(); var form_data = new FormData($('#creationOptionsForm')[0]); $.ajax({ type:'POST',async: false,cache: false,data : form_data,success: function(response){ } }); });
更新:
基本上async:false将执行ajax请求并停止执行更多js代码,直到时间请求完成,因为上传文件可能需要一些时间才能上传到服务器.