Django не может связать загруженный файл

Уточнение: Я разрабатываю поверх модуля администрирования django.

Я реализовал загрузку модели csv с помощью простой формы FileField, и прочитал загруженный текстовый файл с помощью TextIOWrapper без каких-либо проблем.

Я пытаюсь добавить промежуточный экран, предупреждающий пользователя о возможной потере данных. За основу я беру экран подтверждения удаления действия администратором. Проблема заключается в передаче загруженного в память файла на промежуточный экран для доступа к нему после подтверждения пользователем. Я пытался сделать это с помощью связанной формы, но загруженные данные, похоже, исчезают.

Я использую очень простую форму:

class CsvImportForm(forms.Form):
    csv_file = forms.FileField()
    overwrite = forms.BooleanField()

У меня нет проблем при обслуживании GET представления.

Теперь начинается самое интересное. При обработке того же представления для запроса POST, я пытаюсь привязать форму , как указано в документации , и передать ее в конструктор шаблонов:

def import_csv(self, request, form_url="", extra_context=None):
    ...
    if request.method == "POST":
        form = CsvImportForm(request.POST, request.FILES)
        context.update({'form': form})
        ...
        return TemplateResponse(
            request,
            "admin/import_confirm.html",
            context
    )

Метод import_csv является частью моего подкласса ModelAdmin и вызывается путем переопределения метода get_urls.

Шаблон строит форму следующим образом:

<form action="{{ form_url }}" method="post" enctype="multipart/form-data">{% csrf_token %}
    ...
    {{ form.csv_file }}
    ...
    <input type="submit" value="{% translate 'Yes, I’m sure' %}">
    <a href="#" class="button cancel-link">{% translate "No, take me back" %}</a>
    ...
</form>

Однако при загрузке этого представления встроенный ClearableFileInput оказывается пустым. Я даже попробовал загрузить тот же шаблон, что и представление GET, но возникла та же проблема. Особо следует отметить, что BooleanField привязывается правильно, если я решил его поместить.

Во время отладки файл существует в request.FILES, но он каким-то образом исчезает после передачи представления в рендерер.

Что я упускаю из виду? Или есть лучший способ передать файл?

Я обнаружил, что по соображениям безопасности невозможно предоставить пользователю форму с привязанным файлом.

Моим решением было использовать всплывающее окно javascript, чтобы содержимое не перезагружалось.

Вернуться на верх