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

时间:2017-02-20 16:34:48

标签: python content-management-system

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

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

1 个答案:

答案 0 :(得分:0)

它可以完成,但确切的程序在woost 2.11“pacman”和更新版本之后有所改变。此外,如果您不熟悉Cocktail如何获得架构成员的翻译,则会感到有点费解。

您想要定义与此模式匹配的翻译密钥:

Pacman and newer:

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 and newer:

[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))),
)