gpt4 book ai didi

Django 验证错误

转载 作者:行者123 更新时间:2023-12-04 15:12:21 25 4
gpt4 key购买 nike

根据 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
我认为没有任何方法可以检索 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]

最佳答案

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

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

请注意,您正在链接到 Django 文档的开发版本。验证错误不是插入参数,因为您使用的是 Django 1.5 或更早版本。如果您在 1.6 测试版中尝试您的代码,则参数会被插入到错误消息中。

关于Django 验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17898969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com