根据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
参数分别传递变量?为什么不直接插入错误消息msg(暂时忽略命名或位置插值)???
的被修改 的
好的,来自@ https://github.com/django/django/blob/stable/1.5.x/django/forms/forms.py的来源 我不认为有任何方法可以检索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]
答案 0 :(得分:3)
如果您有多个参数,则在翻译错误消息时它们可能会以不同的顺序显示。
命名参数允许您更改参数显示的顺序,而不更改params
。使用参数元组,订单是固定的。
请注意,您正在链接到Django文档的开发版本。验证错误不是插入参数,因为您使用的是Django 1.5或更早版本。如果您在1.6 beta中尝试使用代码,则参数会插入到错误消息中。
答案 1 :(得分:2)
ValidationError
被表单验证例程捕获,虽然它只能显示一条消息,但最好是保存获取params
错误的可能性;例如。字段名称,导致错误的值等。这是在您提供的示例之前说明的。
为了使错误信息更加灵活且易于覆盖