2011-09-05 126 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>