django:双文件上传:js和html
我有两款django车型:django:双文件上传:js和html,django,http-headers,Django,Http Headers,我有两款django车型: class Image(models.Model): name = models.CharField(max_length=100) photo = models.ImageField(upload_to='upload/', blank=True) class Preview(models.Model): photo = models.ImageField(upload_to='preview', blank=True) 然后,我使用M
class Image(models.Model):
name = models.CharField(max_length=100)
photo = models.ImageField(upload_to='upload/', blank=True)
class Preview(models.Model):
photo = models.ImageField(upload_to='preview', blank=True)
然后,我使用ModelForm创建ImageForm并在html模板中呈现它。
我想在页面中进行图像预览。
我用
所以,在javascipt的帮助下,我将图像发送到服务器,在预览视图中调整它的大小-它处理PreviewForm,保存在磁盘上并返回插入img标记的url。它起作用了
在我按下提交按钮后,我无法在我的视图中接收图像文件编辑哪个进程ImageForm:request.FILES为空!!!
当我用js的编辑视图禁用上传图像时,效果很好:request.FILES包含图像,我可以保存它
是什么导致第二次POST请求中的request.FILES消失?您需要了解的第一件事是HTTP是无状态协议。客户机向服务器发出的每个请求都是唯一的,并且独立于前一个请求 在您的情况下,您可以提交包含要上载的图像的表单,并进行上载,以便您可以在request.FILES中查看该图像并显示其预览 但是,一旦您上传并显示新页面,当然request.POST将为空,因为您没有上传任何内容,该文件已经在您的服务器中,等待批准 正确的解决方案是,在准备预览时,创建一些隐藏的输入字段,这将帮助您确定要批准的照片。在这种情况下,唯一ID非常好。此外,除非您是唯一使用该应用程序的人,否则不要将文件路径直接暴露给您的客户端
然后在第二个请求中,检索那些隐藏字段,找到图像并执行您要执行的操作;在您的情况下,请批准并以某种方式将其公开。>但是,一旦您上传并显示新页面,request.POST当然将为空-我不显示新页面。页面不重新加载,其他post变量名。。存在于request.POST中!无论您是通过javascript还是常规方式进行上传,这都无关紧要。这是协议。其他字段之所以存在,是因为它们仍然在页面中,它们被再次发送到服务器,而文件没有再次上传。是的,他使用了ajax,与页面重新加载无关
<script src="/static/js/jquery.ui.widget.js"></script>
<script src="/static/js/jquery.iframe-transport.js"></script>
<script src="/static/js/jquery.fileupload.js"></script>
<script>
$(function () {
$('#id_photo').fileupload({
dataType: 'json',
url: '{% url preview %}',
always: function (e, data) {
$('#preview').css({'visibility': 'visible'});
$('#preview').prepend('<img src=/static/'+data.result.url+' />')
}
});
});
</script>
<form method="POST" action="edit/" enctype="multipart/form-data">
<div class="field">
{{ form.photo.errors }}
<label for="id_photo">Photo:</label>
<input type="file" name="photo" id="id_photo" >
</div>
<div id="preview">
</div>
<input type="submit" name="Change">