Как в django правильно реализовать асинхронную «AJAX» загрузку?
Добрый день.
Занимаюсь изучением Djano и сразу реализацией мелких задумок, для закрепления знаний.
Так вот на этапе обдумывания реализации AJAX Drag&Drop загрузки файлов, возникла проблема, как должно быть правильно реализовано с серверной стороны?
К примеру, есть некая таблица с разными полями и содержащая models.FileField.
Если делать асинхронную AJAX загрузку, как я понимаю, мы должны файл куда то отдельно сохранить, и на этапе валиадации просто передать файл для "сохранения его в БД". Но тогда возникает другой вопрос, как его правильно сохранить, чтобы не потерять и корректно потом "передать его в модель".
Итого возникает 3 реализации: 1. заводить отдельную таблицу для загрузки файлов и привязывать ее к основной моедели.
минусы - избыточность данных, нужно реализовывать слежение за мусорными данными. 2. написать отдельный обработчик для AJAX приема данных, который будет его сохранять во временную директорию и ссылку на файл передавать через сессии к примеру.
минусы - не уверен что все это обойдется без больших проблем. нужно следить чтобы временые папки не захламлялись 3. это менять логику работы, разрешать сохранять в базу без всех заполненных полей, т.е. сохранять данные постепенно в модель.
минусы - непонятная логика работы - костыли.
По мне сейчас кажется это смотреть в сторону 2 реализации. Искать тут более правильный метод.
Ответов в интернете не нашел именно на этот вопрос, везде примеры загрузки идут на отправку и сохранение сразу всех данных, а не по частям.
Хотелось бы услышать мнение или направления куда стоит плыть для решения вопроса.
class ProductForm(models.ModelForm):
class Meta:
model = Product
def myview(request):
from = ProductForm(request.POST, request.FILES)
if form.is_valid():
product = form.save()
Это как раз будет синхронная загрузка, с этим проблем нет, когда со всей формой уходит и файл.
А тут имеется в виду, что есть форма с данными и выбором файла, при выборе файла он автоматически начинается отправляться на сервер.
Вопрос как в минимум костылей привязать его потом в модель, так как файл будет загружен в другом requeste по факту.
Сделать вьюху, которая будет сохранять файл с хешом и возвращать хеш. При помощи JS вставить скрытое поле с возвращенным хэшом. В вьюхе, которая принимает форму, сделать обработку хэша. При помощи диспетчера задач(тут выбирайте сами) сделать проверки на удаление.