Простая загрузка изображений Django - файл изображения не сохраняется
Хорошо, я учусь делать простую форму загрузки изображений, чтобы загрузить изображение в 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 %}
Надеюсь, этого достаточно, чтобы получить помощь. Пожалуйста, дайте мне знать, что еще я могу предоставить. Спасибо, я очень ценю помощь.
4 ответа
Вам не нужно прикреплять его к модели, как утверждает Matt S, request.FILES содержит все данные для изображения, если ваша форма настроена правильно.
Вы должны обязательно использовать enctype="multipart/form-data"
в вашем элементе, как указано в документе: https://docs.djangoproject.com/en/dev/ref/forms/api/
Кроме того, прочитайте документы о загрузке файлов: 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()
Нашел этот удивительный ответ для тех, кто ищет: /questions/44205310/nuzhen-minimalnyij-primer-zagruzki-fajla-django/44205335#44205335
Он содержит полный простой проект Django для загрузки файлов.
Чтобы ваши файлы загружались и отображались в 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>
Вам необходимо прикрепить его к модели (как ImageField), поскольку в настоящее время он нигде не сохраняется. Это может быть обработано без каких-либо проблем прямо сейчас, но оно отбрасывается после того, как представление возвращается.
Неважно, я не осознавал, что модели не нужны.