Django: открыть загруженный файл, находясь в памяти; В методе Form Clean?
Мне нужно проверить содержимое загруженного XML файла в моем чистом методе Form, но я не могу открыть файл для проверки. Он плавно очищается, файл еще не перемещен из памяти (или временного каталога) в целевой каталог.
Например, следующий код не работает, потому что файл еще не был перемещен в это место назначения. Он все еще находится в памяти (или временном каталоге):
xml_file = cleaned_data.get('xml_file')
xml_file_absolute = '%(1)s%(2)s' % {'1': settings.MEDIA_ROOT, '2': xml_file}
xml_size = str(os.path.getsize(xml_file_absolute))
Когда я смотрю на переменную "cleaned_data", она показывает это:
{'xml_file': <InMemoryUploadedFile: texting.nzb (application/octet-stream)>}
cleaned_data.get('xml_file')
возвращает строку "texting.nzb" как строку.
Есть ли другой способ доступа к файлу в памяти (или временном каталоге)?
Опять же, это в моем методе Form clean
, который связан с представлением администрирования по умолчанию. Мне снова и снова говорили, что все проверки должны обрабатываться в форме, а не в представлении. Правильно?
Ответы
Ответ 1
Я предполагаю, что вы связали свою форму с файлами, используя:
my_form = MyFormClass(request.POST, request.FILES)
Если у вас есть, после того, как форма была проверена, вы можете получить доступ к самому содержимому файла, используя словарь request.FILES:
if my_form.is_valid():
data = request.FILES['myfile'].read()
Объект request.FILES ['myfile'] является объектом UploadedFile, поэтому он поддерживает операции чтения/записи, подобные файлу.
Если вам нужно получить доступ к содержимому файла из метода формы clean
(или любого метода чистящего оборудования), вы делаете все правильно. cleaned_data.get('xml_file')
возвращает объект UploadedFile. Метод __str__
этого объекта просто распечатывает строку, поэтому вы видите только имя файла. Однако вы можете получить доступ ко всему содержимому:
xml_file = myform.cleaned_data.get('xml_file')
print xml_file.read()
В этом разделе документации есть несколько отличных примеров: http://docs.djangoproject.com/en/dev/topics/http/file-uploads/