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などのデバッグツールを使用して変数が何であるかを確認しましたが、問題を見つけることができません。

更新MariusGrigaitisとDavideR.が言ったように、すべての個々のフィールドメソッドが実行された後に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()メソッドが呼び出されるまでに、すべての個別のフィールドクリーンメソッドが実行されているため(前の2つのセクション)、self.cleaned_dataには、これまでに存続したすべてのデータが入力されます。したがって、検証したいフィールドが最初の個々のフィールドチェックを生き残っていない可能性があるという事実を考慮に入れることも覚えておく必要があります。

于 2013-03-13T21:08:35.503 に答える