我在django中创建了表单上传文件。这是工作。但是当我在django文件中尝试使用ajax时,上传工作无效。
我的代码:
models.py
class Upload(models.Model):
documents = models.FileField(upload_to=content_file_name)
user = models.ForeignKey(User)
class Meta:
app_label = 'documentapp'
forms.py:
from django import forms
class UploadForm(forms.Form):
documents = forms.FileField()
HTML:
<input type="file" name="documents" id="documents" class="form-control" required="required""/>
<input type="button" id="upload_file_button" required="required" value="Upload" onclick="UploadUserDocuments()"/>
ajax在同一个html文件中:
function UploadUserDocuments() {
$.ajax({
url: "/signup/upload/",
type: "POST",
data: {
documents:$('education_documents').val(),
},
success: function(response){
}
});
}
view.py
def upload(request):
context = RequestContext(request)
if request.method == 'POST':
form = UploadForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES['file'])
return HttpResponse('true')
else:
return HttpResponse('GET')
handle_uplaoded_fiel.py
def handle_uploaded_file(f):
with open('some/file/name.txt', 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
答案 0 :(得分:1)
HTML / JS存在一些问题。
HTML的第一行有required
属性值的双重终止引号。
您的UploadUserDocuments()函数执行以下操作:
$('education_documents').val()
尝试匹配诸如<education_documents>
之类的元素,而不是通过其id(即使用#选择器)选择元素值的常用方法。
但是,使用JQuery执行文件上载更为复杂。这个答案有一些想法:How can I upload files asynchronously?
答案 1 :(得分:0)
您似乎没有发送csrf_token。您可以使用csrf_exempt装饰器来跳过它(不是真正推荐的)。
否则,您应该将{%csrf_token%}标记添加到模板中。它将使用CSRF令牌创建隐藏字段。您可以在official documentation中找到如何在AJAX中处理它的方法。
另外我很好奇为什么不从变量渲染表单,而是手动添加HTML - 但它与主题没有直接关系。
所以我要这样做: HTML:
<form id="upload_doc" action="/signup/upload/" method="post" enctype="multipart/form-data"> {% csrf_token %}
{{form}}
<input type="submit" value="send">
</form>
另请参阅@Ben Rowland回复
的通知