【问题标题】:Simple Django Image Upload - Image file not saving简单的 Django 图像上传 - 图像文件不保存
【发布时间】:2011-11-10 07:40:04
【问题描述】:

是的,我正在学习如何做一个简单的图像上传表单来将图像上传到 MEDIA_ROOT。表单呈现正常,我没有收到任何错误,但文件未显示在 MEDIA_ROOT 目录中。如果遵循文档示例并且无法使其工作,我知道这是因为我没有正确理解 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 %}

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

【问题讨论】:

    标签: django file-upload django-forms django-uploads


    【解决方案1】:

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

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

    【讨论】:

    • 感谢马特的回复。我创建了以下模型: class Gallery(models.Model): image = models.ImageField(upload_to='gallery') 现在如何将此模型附加到表单以及它与 django FileUploadHandler 有何关系?
    【解决方案2】:

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

    【讨论】:

    • 感谢乔丹。我忘记添加正确的编码类型。我现在已经这样做了。我也忘记安装使用 ImageField 所需的 PIL。我已经按照 django 文档进行文件上传,上面的代码就是我想出的。现在我看不出我做错了什么,但我觉得它必须完成我对 django 提供的 FileUploadHandler 的使用。您能否提供一些有关正确使用处理程序的见解?感谢您的帮助。
    【解决方案3】:

    为了让您的文件上传并显示在 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 2016-04-23
      • 2018-05-16
      • 1970-01-01
      • 2013-10-20
      相关资源
      最近更新 更多