0

我一直在寻找答案,但我真的不知道这是怎么回事。我正在尝试制作一个接收 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

问题是,当我使用它时,输入检查不起作用(表单提交时未选择任何文件)。当我删除此代码时,它工作正常。对自定义 clean() 函数的调用super(UploadForm, self).clean()与 django 文档中的调用相同。我正在使用 django 1.4。有什么想法吗?

谢谢!

4

1 回答 1

2

文件字段有点复杂;您必须确保在实例化文件时将文件绑定到表单。如果你使用基于类的通用视图,这应该会自动发生,所以如果你没有看到它们,那么我猜你没有。在这种情况下,请查看https://docs.djangoproject.com/en/1.4/ref/forms/api/#binding-uploaded-files。简而言之,当您实例化表单时,您必须从中获取文件request.FILES并将它们作为单独的参数传递给您的表单,例如f = MyForm(request.POST, request.FILES).

还要确保您enctype="multipart/form-data"FORM标签中有 HTML。

于 2012-07-06T09:56:04.490 回答