Django自定义forms.clean()方法不起作用

时间:2012-07-06 08:26:41

标签: django django-forms error-checking

我一直在寻找答案,但我真的不知道这是怎么发生的。我正在尝试创建一个接收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。有什么想法吗?

谢谢!

1 个答案:

答案 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