首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >姜戈ValidationError

姜戈ValidationError
EN

Stack Overflow用户
提问于 2013-07-27 14:39:58
回答 2查看 5.8K关注 0票数 7

根据https://docs.djangoproject.com/en/dev/ref/forms/validation/

代码语言:javascript
复制
   # Good
   ValidationError(
        _('Invalid value: %(value)s'),
        params={'value': '42'},
   )

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

医生并没有真正解释为什么它是坏的/好的。有人能举一个具体的例子吗?

此外,当我检查form.errors时,我得到了类似于'Invalid: %(value)s'的东西。如何从验证错误中获取参数并将其插入到错误msg中?

编辑的

这被认为是好事吗?

代码语言:javascript
复制
   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对象本身。请参阅下面的代码。

代码语言:javascript
复制
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]
EN

回答 2

Stack Overflow用户

发布于 2013-07-27 14:58:45

如果您有多个参数,则在翻译错误消息时,它们可能以不同的顺序出现。

命名参数允许您更改参数出现的顺序,而无需更改params。使用一个元组参数,顺序是固定的。

请注意,您正在链接到Django文档的开发版本。由于使用Django 1.5或更早版本,所以验证错误并不是插值参数。如果您在1.6测试版中尝试您的代码,那么参数将被内插到错误消息中。

票数 3
EN

Stack Overflow用户

发布于 2013-07-27 15:00:05

ValidationError被表单验证例程捕获,虽然它只显示一条消息,但最好避免获得错误params的可能性;字段名、导致错误的值等。在你提供的例子之前已经说明过了。

以便使错误消息具有灵活性和易于重写。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17898969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档