2012-07-06 107 views
0

我一直在寻找答案一段时间,但我真的不知道如何发生这种情况。我试图制作一个接收2个文件的表单,并且我重写了clean()方法来检查名称和扩展名是否正确。这是我有:Django自定义forms.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

代码看起来不错。你的clean()方法是否被执行?你可以在第一行“断言0”。 – guettli 2012-07-06 09:13:56

+0

刚刚检查,它确实执行 – 2012-07-06 09:53:00

回答

2

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

此外,请确保您的FORM标记中有enctype="multipart/form-data"

+0

我正在做你刚才提到的,但它不工作。我基本上复制了上传文件的代码并更改了变量的名称。但谢谢你的答案! – 2012-07-09 21:03:38

+0

嗯,你在self.cleaned_data中看到什么了吗?它与clean_data不同吗?那么self.files呢? – tomds 2012-07-10 08:29:07