Страницы

Поиск по вопросам

суббота, 11 апреля 2020 г.

Загрузка файлов в Django

#python #django

                    
setting.py

PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media')


MEDIA_URL = '/media/'
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static') 

STATIC_URL = '/static/'


форма

{% csrf_token %} {{ form }}
views.py def uploads(request): if request.method == 'POST': form = upload(request.POST, request.FILES) return HttpResponse(request.FILES['file'].temporary_file_path) else: form = upload() return render_to_response('ff.html', {'form': form}) request.FILES['file'].temporary_file_path должен возвращать путь к временному файлу.В папке media файл отсутствует, а в браузере отображается только знак > в модели формы только поле FileField(). При добавлении в него upload_to в консоли выдается ошибка __init__() got an unexpected keyword argument 'upload_to'


Ответы

Ответ 1



Кратко: файл, загружаемый через форму, необходимо обработать, чего ваша программа не делает. Когда вы загружаете файл, Django сперва помещает его во временно хранилище. Маленькие файл размещаются в памяти, большие — в системной временной директории (на Linux это /tmp/). Пример (UploadFileForm — форма, содержащая поле file типа FileField): def upload_file(request): # Если метод POST if request.method == 'POST': # Заполняем форму полученными данными form = UploadFileForm(request.POST, request.FILES) # Если данные валидны if form.is_valid(): # обрабатываем файл handle_uploaded_file(request.FILES['file']) # перенаправляем на другую страницу return HttpResponseRedirect('/success/url/') # Если другой метод (обычно GET) else: form = UploadFileForm() # Выводим форму загрузки return render_to_response('upload.html', {'form': form}) Перенаправление делают для того, чтобы при обновлении страницы файл не загружался повторно. handle_uploaded_file — функция обработки файла, её нужно писать самому. Пример копирования содержимого полученного файла в файл /srv/media/data.txt: def handle_uploaded_file(f): with open('/srv/media/data.txt', 'wb+') as dest: for chunk in f.chunks(): dest.write(chunk) Нужно использовать chunks, так как копирование по частям меньше нагружает систему. Просто копирование из временной папки тоже не подходит, так как файл может быть загружен в память. Путь, по которому будет сохраняться файл можно сформировать самому из MEDIA_ROOT и имени загруженного файла с помощью os.path.join. Обрабатывать файл можно по-разному. Можно прочитать его содержимое целиком при помощи метода read() или по частям с помощью метода chunks() и что-то с ним сделать. Но чаще всего файл просто сохраняют в какую-либо директорию, где он будет в дальнейшем хранится. Также Django предоставляет удобный способ. Если файл также хранится в модели, то его можно сохранить в указанное место одним вызовом. Для этого в модели вы создаёте поле типа FileField с аргументом upload_to, содержащим путь, по которому будет размёщён файл. Если вы создавали форму на основе модели (то есть, с помощью ModelForm), то достаточно команды form.save() для сохранения файла в указанное место. Также вы сможете загружать файлы через админку. Загрузка файлов в Django

Комментариев нет:

Отправить комментарий