3

这是代码:

...

class Meta:
    model = Card

def clean_video_url(self):
    video_url = self.cleaned_data['video_url']
    if video_url != '' and len(video_url) != YOUTUBE_VIDEO_URL_LENGTH:
        pos = string.find(video_url, YOUTUBE_VIDEO_URL_IDENTIFIER)
        identifier_length = len(YOUTUBE_VIDEO_URL_IDENTIFIER)
        if pos == -1:
            raise forms.ValidationError(_('youtube-url-not-valid'))
        video_url = video_url[pos+identifier_length:pos+identifier_length+YOUTUBE_VIDEO_URL_LENGTH]
    return video_url

...

def clean(self):
    video_url = self.cleaned_data['video_url']
    field1 = self.cleaned_data['field1']
    if video_url == '' and field1 == '':
        raise forms.ValidationError(_('must-fill-video-url-or-front'))
    return self.cleaned_data

最令人不安的是,它几乎在所有情况下都有效(提交并保存在数据库中)。当我在video_url 字段中编写像“aeuchah”这样的虚拟文本时,它不起作用,而是抛出:

Exception Type: KeyError
Exception Value:    
'video_url'

我重新阅读了我的 clean_video_url 方法,并使用 pdb.set_trace 之类的调试工具查看了哪些变量,但我找不到问题所在。

更新正如 Marius Grigaitis 和 Davide R. 所说,在完成所有单个字段方法之后调用 clean 方法。clean_video_url 引发了 ValidationError 并且没有返回任何内容,因此 clean 方法没有发现任何可使用的内容并引发了 KeyError。

4

1 回答 1

4

cleaned_data在方法中使用它之前,您应该始终检查它是否存在clean()。如果先前的验证未通过,则不能保证值存在于cleaned_data 数组中。

文档:https ://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

到调用表单的clean()方法时,所有单独的字段清理方法都将运行(前两节),因此 self.cleaned_data 将填充迄今为止存活的任何数据。因此,您还需要记住要考虑到您要验证的字段可能无法通过初始单个字段检查的事实。

于 2013-03-13T21:08:35.503 回答