7

https://docs.djangoproject.com/en/dev/ref/forms/validation/によると

   # Good
   ValidationError(
        _('Invalid value: %(value)s'),
        params={'value': '42'},
   )

   # Bad
   ValidationError(_('Invalid value: %s') % value)

ドキュメントは、なぜそれが悪い/良いのかを実際に説明していません。誰かが具体的な例を挙げてもらえますか?

さらに、 を調べるform.errorsと、 のようなものが得られます'Invalid: %(value)s'。検証エラーからパラメーターを取得し、それらをエラーメッセージに補間するにはどうすればよいですか?

編集済み

それで、これは良いと考えられますか?

   ValidationError(
        _('Invalid value: %(value)s') % {'value': '42'},
   )

params本当の問題は、引数を介して変数を個別に渡す理由だと思います。エラーメッセージに直接補間しないのはなぜですか(今のところ、名前付きまたは位置補間を無視してください)???

編集済み

わかりました、ソース @ https://github.com/django/django/blob/stable/1.5.x/django/forms/forms.py から Form は ValidationError のパラメーターを取得するため、ValidationError のパラメーターを取得する方法はないと思いますValidationError オブジェクト自体も保存しません。以下のコードを参照してください。

class ValidationError(Exception):
    """An error while validating data."""
    def __init__(self, message, code=None, params=None):
        import operator
        from django.utils.encoding import force_text
        """
        ValidationError can be passed any object that can be printed (usually
        a string), a list of objects or a dictionary.
        """
        if isinstance(message, dict):
            self.message_dict = message
            # Reduce each list of messages into a single list.
            message = reduce(operator.add, message.values())

        if isinstance(message, list):
            self.messages = [force_text(msg) for msg in message]
        else:
            self.code = code
            self.params = params
            message = force_text(message)
            self.messages = [message]

class Form:
    ....
    def _clean_fields(...):
       ....
       except ValidationError as e:
            self._errors[name] = self.error_class(e.messages)  # Save messages ONLY
            if name in self.cleaned_data:
                del self.cleaned_data[name]
4

2 に答える 2

3

複数のパラメーターがある場合、エラー メッセージを翻訳すると、異なる順序で表示されることがあります。

名前付き引数を使用すると、引数を変更せずに、引数が表示される順序を変更できますparams。引数のタプルを使用すると、順序が固定されます。

Django ドキュメントの開発バージョンにリンクしていることに注意してください。Django 1.5 以前を使用しているため、検証エラーはパラメーターを補間していません。1.6 ベータ版でコードを試すと、パラメーターがエラー メッセージに挿入されます。

于 2013-07-27T14:58:45.697 に答える
2

ValidationErrorparamsフォーム検証ルーチンによってキャッチされ、メッセージを表示することはできますが、エラーが発生する可能性を回避することをお勧めします。例えば。フィールド名、エラーの原因となった値など。あなたが提供した例の直前に記載されています。

エラーメッセージを柔軟で上書きしやすいものにするため

于 2013-07-27T15:00:05.077 に答える