我需要在Form clean方法中验证上传的XML文件的内容,但是我无法打开该文件进行验证.它接缝,在clean方法中,文件尚未从内存(或临时目录)移动到目标目录.
例如,以下代码不起作用,因为该文件尚未移动到该目标.它仍然在内存(或临时目录)中:
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))
Run Code Online (Sandbox Code Playgroud)
当我查看"cleaning_data"变量时,它会显示:
{'xml_file': <InMemoryUploadedFile: texting.nzb (application/octet-stream)>}
Run Code Online (Sandbox Code Playgroud)
cleaned_data.get('xml_file') 只返回"texting.nzb"作为字符串.
是否有另一种方法来访问内存(或临时目录)中的文件?
同样,这是我的Form的clean方法,它绑定到默认的管理视图.我一次又一次地被告知所有验证都应该在表单中处理,而不是视图.正确?
Jar*_*die 21
我假设你已经使用以下方法将表单绑定到文件:
my_form = MyFormClass(request.POST, request.FILES)
Run Code Online (Sandbox Code Playgroud)
如果您已经验证了表单,则可以使用request.FILES字典访问文件内容:
if my_form.is_valid():
data = request.FILES['myfile'].read()
Run Code Online (Sandbox Code Playgroud)
request.FILES ['myfile']对象是一个UploadedFile对象,因此它支持类似文件的读/写操作.
如果您需要从表单的clean方法(或清理机制的任何方法)中访问文件内容,那么您正在做正确的事情.cleaned_data.get('xml_file')返回一个UploadedFile对象.该__str__对象的方法只打印出字符串,这就是为什么你只看到文件名.但是,您可以访问整个内容:
xml_file = myform.cleaned_data.get('xml_file')
print xml_file.read()
Run Code Online (Sandbox Code Playgroud)
这部分文档有一些很好的例子:http://docs.djangoproject.com/en/dev/topics/http/file-uploads/