我一直在寻找答案,但我真的不知道这是怎么发生的。我正在尝试创建一个接收2个文件的表单,并且我重写了clean()方法以检查名称和扩展名是否正确。这就是我所拥有的:
def clean(self):
cleaned_data = super(UploadForm, self).clean()
obs_filename = cleaned_data.get('obs').name.split('.')
nav_filename = cleaned_data.get('nav').name.split('.')
if obs_filename[0] != nav_filename[0] or [obs_filename[1], nav_filename[1]] != ['obs', 'nav']:
raise forms.ValidationError('Filenames do not match.')
if os.path.isfile(PROJECT_ROOT + '/data/unprocessed/' + '.'.join(obs_filename)) and os.path.isfile(PROJECT_ROOT + '/data/unprocessed/' + '.'.join(nav_filename)):
raise forms.ValidationError('Files already exist.')
return cleaned_data
问题是,当我使用它时,检查输入不起作用(表单提交而不选择任何文件)。当我删除此代码时,它工作正常。
对super(UploadForm, self).clean()
的调用与自定义clean()函数的django文档中的调用相同。我正在使用django 1.4。有什么想法吗?
谢谢!
答案 0 :(得分:2)
文件字段有点复杂;实例化时,必须确保文件绑定到表单。如果你使用基于类的通用视图,这应该是自动发生的,所以如果你没有看到它们,那么我猜你不是。在这种情况下,请查看https://docs.djangoproject.com/en/1.4/ref/forms/api/#binding-uploaded-files。简而言之,当您实例化表单时,您必须从request.FILES
获取文件并将这些文件作为单独的参数传递给您的表单,例如f = MyForm(request.POST, request.FILES)
。
另外,请确保HTML中的enctype="multipart/form-data"
标记中包含FORM
。