根据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'的东西。如何从验证错误中获取参数并将其插入到错误msg中?
编辑的
这被认为是好事吗?
ValidationError(
_('Invalid value: %(value)s') % {'value': '42'},
)我认为真正的问题是:为什么通过params参数单独传递变量?为什么不直接插入到误差msg (暂时忽略命名或位置插值)?
编辑的
好的,在源@ https://github.com/django/django/blob/stable/1.5.x/django/forms/forms.py中,我认为没有任何方法可以检索ValidationError的params,因为表单not甚至保存了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]发布于 2013-07-27 14:58:45
如果您有多个参数,则在翻译错误消息时,它们可能以不同的顺序出现。
命名参数允许您更改参数出现的顺序,而无需更改params。使用一个元组参数,顺序是固定的。
请注意,您正在链接到Django文档的开发版本。由于使用Django 1.5或更早版本,所以验证错误并不是插值参数。如果您在1.6测试版中尝试您的代码,那么参数将被内插到错误消息中。
发布于 2013-07-27 15:00:05
ValidationError被表单验证例程捕获,虽然它只显示一条消息,但最好避免获得错误params的可能性;字段名、导致错误的值等。在你提供的例子之前已经说明过了。
以便使错误消息具有灵活性和易于重写。
https://stackoverflow.com/questions/17898969
复制相似问题