2011-09-05 82 views
1

正确的我正在学习如何做一个简单的图像上传形式上传图像到MEDIA_ROOT。表单呈现很好,我没有遇到任何错误,但该文件没有显示在MEDIA_ROOT目录中。如果遵循文档示例,并且无法使其工作,并且我知道这是因为我没有正确理解django文件上传handeling。因此,这里是我的代码:简单的Django图像上传 - 图像文件没有保存

forms.py

from django import forms 

class UploadImageForm(forms.Form): 
    image = forms.ImageField() 

views.py

def merchant_image_upload(request): 
    if request.method == 'POST': 
     form = UploadImageForm(request.POST, request.FILES) 
     if form.is_valid(): 
      FileUploadHandler(request.FILES['image']) 
      return HttpResponseRedirect('/dashboard/gallery') 
    else: 
     form = UploadImageForm() 
    return render_to_response('gallery.html', RequestContext(request, {'form': form})) 

模板文件

{% extends 'base.html' %} 
{% block main %} 
    <form action="{% url scvd.views.merchant_image_upload %}" method="post">{% csrf_token %} 
     {{ form.image }} 
     <input type="submit" value="Upload" /> 
    </form> 
{% endblock %} 

希望这是足够的信息,以得到一些帮助。请让我知道我还能提供什么。谢谢,我非常感谢你的帮助。

回答

13

您不需要像Matt S所说的那样将它附加到模型上,request.FILES具有图像的所有数据(如果您的表单设置正确)。

你需要确保使用enctype="multipart/form-data"在你的元素,如文档状态这里:https://docs.djangoproject.com/en/dev/ref/forms/api/#binding-uploaded-files-to-a-form

除此之外,阅读文档有关文件上传:https://docs.djangoproject.com/en/dev/topics/http/file-uploads/

所有你需要的是有据可查的存在。希望这可以帮助!

编辑OP要求对文件上传

更多信息从文档:

大多数时候,你会简单地从申请中描述传递文件数据到 形式将上传的文件绑定到表单。这将 看起来像:

from django.http import HttpResponseRedirect 
from django.shortcuts import render_to_response 

# Imaginary function to handle an uploaded file. 
from somewhere import handle_uploaded_file 

def upload_file(request): 
    if request.method == 'POST': 
     form = UploadFileForm(request.POST, request.FILES) 
     if form.is_valid(): 
      handle_uploaded_file(request.FILES['file']) 
      return HttpResponseRedirect('/success/url/') 
    else: 
     form = UploadFileForm() 
    return render_to_response('upload.html', {'form': form}) 

而且他们还有的你怎么能写handle_uploaded_file函数的一个例子:

def handle_uploaded_file(f): 
    destination = open('some/file/name.txt', 'wb+') 
    for chunk in f.chunks(): 
     destination.write(chunk) 
    destination.close() 
+0

感谢约旦。我忘记了添加适当的enctype。我现在已经这样做了。我也忘记安装使用ImageField所需的PIL。我按照django文件上传文件,上面的代码就是我想出来的。现在我没有看到我做错了什么,但是我觉得必须使用由django提供的FileUploadHandler。你能否提供一些正确使用处理程序的见解?我很感激帮助。 –

0

您需要将它附加到模型(作为 ImageField),因为它目前没有保存在任何地方。它现在可以在没有任何问题的情况下处理,但在视图返回后它会被丢弃。

没关系,我没有意识到模型是不必要的。

+1

感谢您的响应马特。我创建了以下模型:class Gallery(模型。模型): image = models.ImageField(upload_to ='gallery')现在我该如何将这个模型附加到窗体上,以及它如何与django FileUploadHandler相关? –

0

为了上传文件,并显示在request.FILES,您的形式必须包含ENCTYPE =“多部分/格式数据”,如下所示:

<form action="{% url scvd.views.merchant_image_upload %}" method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ form.image }} 
    <input type="submit" value="Upload" /> 
</form>