Как в django правильно реализовать асинхронную «AJAX» загрузку?

Добрый день.
Занимаюсь изучением Djano и сразу реализацией мелких задумок, для закрепления знаний.
Так вот на этапе обдумывания реализации AJAX Drag&Drop загрузки файлов, возникла проблема, как должно быть правильно реализовано с серверной стороны?

К примеру, есть некая таблица с разными полями и содержащая models.FileField.

Если делать асинхронную AJAX загрузку, как я понимаю, мы должны файл куда то отдельно сохранить, и на этапе валиадации просто передать файл для "сохранения его в БД". Но тогда возникает другой вопрос, как его правильно сохранить, чтобы не потерять и корректно потом "передать его в модель".

Итого возникает 3 реализации:
1. заводить отдельную таблицу для загрузки файлов и привязывать ее к основной моедели.
минусы - избыточность данных, нужно реализовывать слежение за мусорными данными.
2. написать отдельный обработчик для AJAX приема данных, который будет его сохранять во временную директорию и ссылку на файл передавать через сессии к примеру.
минусы - не уверен что все это обойдется без больших проблем. нужно следить чтобы временые папки не захламлялись
3. это менять логику работы, разрешать сохранять в базу без всех заполненных полей, т.е. сохранять данные постепенно в модель.
минусы - непонятная логика работы - костыли.

По мне сейчас кажется это смотреть в сторону 2 реализации. Искать тут более правильный метод.

Ответов в интернете не нашел именно на этот вопрос, везде примеры загрузки идут на отправку и сохранение сразу всех данных, а не по частям.

Хотелось бы услышать мнение или направления куда стоит плыть для решения вопроса.
  • Вопрос задан
  • 1019 просмотров
Решения вопроса 2
un1t
@un1t
Во вьюхе из request.FILES просто в модель засовываешь и сохраняешь

product = Product()
product.image = request.FILES['images']
product.save()


На а еще лучше ModelForm использовать.

class ProductForm(models.ModelForm):
    class Meta:
        model = Product

def myview(request):
    from = ProductForm(request.POST, request.FILES)
    if form.is_valid():
        product = form.save()


Руками файлы куда-то сохранять не надо.
Ответ написан
@FireGM
Сделать вьюху, которая будет сохранять файл с хешом и возвращать хеш. При помощи JS вставить скрытое поле с возвращенным хэшом. В вьюхе, которая принимает форму, сделать обработку хэша. При помощи диспетчера задач(тут выбирайте сами) сделать проверки на удаление.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы