Простая загрузка изображений 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), поскольку в настоящее время он нигде не сохраняется. Это может быть обработано без каких-либо проблем прямо сейчас, но оно отбрасывается после того, как представление возвращается.

Неважно, я не осознавал, что модели не нужны.

Другие вопросы по тегам