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, чтобы содержимое не перезагружалось.