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]