2

对,我正在学习如何做一个简单的图像上传表单来将图像上传到 MEDIA_ROOT。表单呈现正常,我没有收到任何错误,但文件未显示在 MEDIA_ROOT 目录中。如果遵循文档示例并且无法使其工作,我知道这是因为我没有正确理解 django 文件上传处理。所以这是我的代码:

表格.py

from django import forms

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

视图.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 %}

希望这是足够的信息来获得一些帮助。请让我知道我还能提供什么。谢谢你,我真的很感谢你的帮助。

4

3 回答 3

18

您不需要像 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/

您所需要的一切都在那里有据可查。希望这可以帮助!

EDIT 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()
于 2011-09-05T01:52:10.033 回答
1

为了让您的文件上传并显示在 request.FILES 中,您的表单必须包含 enctype="multipart/form-data",如下所示:

<form action="{% url scvd.views.merchant_image_upload %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.image }}
    <input type="submit" value="Upload" />
</form>
于 2016-04-07T04:41:08.020 回答
0

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

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

于 2011-09-05T01:39:48.680 回答