这是代码:
...
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。