下面的代碼:爲什麼Django在這個表單驗證上拋出一個KeyError?
...
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,但我找不到問題。
UPDATE:馬呂斯Grigaitis和達維德R.說,所有的單個字段的方法完成後的清潔方法被調用。 clean_video_url引發了一個ValidationError並且什麼也沒有返回,所以clean方法沒有發現任何東西可用,並引發了一個KeyError。
你可以顯示完整的追溯? – 2013-03-13 21:06:23
我今天早些時候回答了這個完全相同的問題:http://stackoverflow.com/questions/15382914/ – 2013-03-13 21:13:39
你說得對,那確實是問題所在。我明白表單驗證如何更好地發揮作用。謝謝。 – user1011444 2013-03-13 21:33:39