是的,我正在学习如何使用简单的图像上传表单将图像上传到MEDIA_ROOT。表单呈现正常,我没有错误,但文件没有出现在MEDIA_ROOT目录中。如果遵循文档示例并且无法使其工作,我知道这是因为我没有正确理解django文件上传handeling。所以这是我的代码:
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 %}
希望这足以获得一些帮助。请让我知道我还能提供什么。谢谢,我非常感谢你的帮助。
答案 0 :(得分:16)
如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()
答案 1 :(得分:2)
找到了这个令人敬畏的答案:https://stackoverflow.com/a/8542030
它包含一个用于上传文件的完整简单的django项目。
答案 2 :(得分:0)
您需要将其附加到模型(作为ImageField),因为它目前没有保存在任何地方。它现在可以毫无问题地处理,但在视图返回后会被丢弃。
没关系,我没有意识到模特是不必要的。
答案 3 :(得分:0)
为了将您的文件上传并显示在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>