Простая загрузка изображений Django - файл изображения не сохраняется - PullRequest
1 голос
/ 05 сентября 2011

Правильно. Я учусь делать простую форму загрузки изображений, чтобы загрузить изображение в 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 ]

16 голосов
/ 05 сентября 2011

Вам не нужно прикреплять его к модели, как утверждает Мэтт 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()
2 голосов
/ 03 июля 2013

Нашел этот удивительный ответ тем, кто ищет: https://stackoverflow.com/a/8542030

Содержит полный простой проект django для загрузки файлов.

0 голосов
/ 07 апреля 2016

Для того, чтобы ваши файлы загружались и отображались в 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>
0 голосов
/ 05 сентября 2011

Вам необходимо прикрепить его к модели (как ImageField ), поскольку в настоящее время он нигде не сохраняется.Это может быть обработано без каких-либо проблем прямо сейчас, но оно отбрасывается после того, как представление возвращается.

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

...