22

Django のドキュメントhttps://docs.djangoproject.com/en/dev/ref/forms/validation/#raising-validationerrorでは、ValidationError 例外を発生させながらエラー コードを生成することをお勧めします。

# Good
ValidationError(_('Invalid value'), code='invalid')

# Bad
ValidationError(_('Invalid value'))

アプリケーションに API があり、フォームを使用して入力データを検証しています。
フォームが有効でない場合、これらのエラー コード (エラー メッセージではない) を取得したいと考えています。

そこで、BaseForm の _clean_fields メソッドのソースコードを見てみました:
https://github.com/django/django/blob/master/django/forms/forms.py#L278

except ValidationError as e:
    self._errors[name] = self.error_class(e.messages)
    if name in self.cleaned_data:
        del self.cleaned_data[name]

私が理解しているように、このパラメーター ( self.code) はどこにも渡されず、フォームの検証後に取得できません。

誰かがこのエラーコードを使用する目的を説明できますか?

4

2 に答える 2

24

Django 1.7 では、フォームから元のエラー データにアクセスできるようになりました。またはでas_data()メソッドを呼び出すことができます。例: . これは基本的に、メッセージ自体ではなく元のオブジェクトを提供します。ここからプロパティにアクセスできます。ErrorListErrorDictmy_form.errors.as_data()ValidationError.codemy_form.errors["__all__"].as_data()[0].code

API に最適なフォーム エラーをシリアル化することもできます。

>>> print(form.errors.as_json())
{"__all__": [
    {"message": "Your account has not been activated.", "code": "inactive"}
]}
于 2014-07-21T20:43:52.423 に答える
2

django src の ValidationError 定義を見てください。追加の識別子を渡す便利な方法として使用されます (e.errno標準の Python 例外と同様)。次のように使用できます。

try:
    ...
    raise ValidationError(u'Oops', code=0x800)
    ...

except ValidationError as e:
    print "Error code: ", e.code
于 2013-09-13T09:36:38.733 に答える