如何在 Woost 中自定义验证错误消息?

How can I customize validation error messages in Woost?

我有一个模型,其 schema.Date 成员对其最大允许值有限制。验证工作正常,但我需要为生成的错误显示不同的翻译。

我可以为我的模型自定义 cocktail.schema.exceptions.MaxValueError 错误的翻译吗?

可以做到,但是在 woost 2.11 "pacman" 和更新版本之后,确切的过程发生了一些变化。此外,如果您不熟悉 Cocktail 如何获取模式成员的翻译,它可能会让人感到有些费解。

您想定义一个匹配此模式的翻译键:

Pacman 及更新版本:

myapp.models.mymodule.MyModel.members.my_member.errors.cocktail.schema.exceptions.MaxValueError

旧版本:

MyModel.my_member-error: cocktail.schema.exceptions.MaxValueError

请注意键如何将您的成员名称与您要为其定义描述的异常类型组合在一起。

请注意,虽然 Pacman 约定与以前版本中使用的更紧凑的模式相比似乎过长,但它应用了适当的命名空间以避免命名冲突,此外,它利用新的 .strings 文件格式允许您写这样的东西:

[myapp.models.mymodule.MyModel]

    [members]

        [my_member]
        # Your member's name, and other related strings

            [errors]
            # You can put all your error customizations here

                [cocktail.schema.exceptions.MaxValueError]
                en: Member XYZ is too high!
                es: El campo XYZ es demasiado grande!

旧版本的等效项是在 strings.py 文件中添加以下内容:

translations.define(
    "MyModel.my_member-error: cocktail.schema.exceptions.MaxValueError",
    en = u"Member XYZ is too high!",
    es = u"El campo XYZ es demasiado grande!"
)

无论您使用的是哪个版本,您都可以查看 cocktail.schema.Member.translate_error 方法,了解 Cocktail 在后台做了什么来获取翻译。

此外,如果您正在处理验证错误,您可能正在使用架构适配器。如果是这种情况,您将需要考虑您的自定义翻译是属于模型还是属于您的改编形式架构,具体取决于您的自定义是否适用于该字段产生此错误的任何场景,或者它是否只对您有意义特定形式。如果您想将其限制在您的表单中,请将 myapp.models.MyModel 替换为您的表单的限定名称。

最后,您可能想要使用动态翻译,将错误对象的详细信息包含到您的翻译中:

Pacman 及更新版本:

[myapp.models.mymodule.MyModel]

    [members]

        [my_member]
        # Your member's name, and other related strings

            [errors]
            # You can put all your error customizations here

                [cocktail.schema.exceptions.MaxValueError(member, error)]
                en: Member t{member} is too high! The maximum permitted value is ${member.translate_value(error.max)}
                es: El campo t{member} es demasiado grande! El valor máximo permitido es ${member.translate_value(error.max)}

旧版本:

translations.define(
    "MyModel.my_member-error: cocktail.schema.exceptions.MaxValueError",
    en = lambda instance: u"Member %s is too high! The maximum allowed value is %s" % (translations(instance.member, instance.member.translate_value(instance.max))),
    es = lambda instance: u"El campo %s es demasiado grande! El valor máximo permitido es %s" % (translations(instance.member, instance.member.translate_value(instance.max))),
)