【问题标题】:Django override default form error messagesDjango 覆盖默认表单错误消息
【发布时间】:2010-12-01 16:37:20
【问题描述】:

如何覆盖项目中所有应用程序(或至少 1 个应用程序)的默认表单错误消息(例如:需要其他语言的错误消息)

谢谢!

【问题讨论】:

    标签: django forms message


    【解决方案1】:

    最简单的方法是为表单字段定义提供一组默认错误。表单字段可以为其指定一个命名参数。例如:

    my_default_errors = {
        'required': 'This field is required',
        'invalid': 'Enter a valid value'
    }
    
    class MyForm(forms.Form):
        some_field = forms.CharField(error_messages=my_default_errors)
        ....
    

    希望这会有所帮助。

    【讨论】:

    • 是的。但是我想通过灵活地设置特定表单来覆盖默认值......在你的情况下,我必须每次手动合并默认值和表单错误消息字典
    • @Brock 这还不错。您可以只写my_default_errors.update({…}) 以放入字段或形成特定值。
    【解决方案2】:

    要全局覆盖“必需”错误消息,请在字段上设置 default_error_messages 类属性:

    # form error message override
    from django.forms import Field
    from django.utils.translation import ugettext_lazy
    Field.default_error_messages = {
        'required': ugettext_lazy("This field is mandatory."),
    }
    

    这需要在实例化任何字段之前发生,例如通过将其包含在 settings.py 中。

    【讨论】:

    • 这只是猴子修补它,应该避免,因为那样你的应用程序更依赖于加载顺序(以及许多其他原因)。
    【解决方案3】:

    也来自 google,我需要的是覆盖表单中所有字段的默认必需消息,而不是每次定义新表单字段时都传递 error_messages 参数。另外,我还没有准备好深入研究 i18n,这个应用程序不需要是多语言的。这篇博文中的评论最接近我想要的:-

    http://davedash.com/2008/11/28/custom-error-messages-for-django-forms/

    对于所有需要消息的表单字段,这就是我所做的:-

    class MyForm(forms.Form):
        def __init__(self, *args, **kwargs):
            super(MyForm, self).__init__(*args, **kwargs)
            for k, field in self.fields.items():
                if 'required' in field.error_messages:
                    field.error_messages['required'] = 'You have to field this.'
    
    class MUserForm(MyForm):
        user = forms.CharField(
            label="Username",
        )
        ....
    

    【讨论】:

    • 您可能不想这样做,或者至少要小心这样做。如果您在继承的表单上执行此操作,它也会更改父表单上的错误消息。
    【解决方案4】:

    你可能想看看Django的优秀i18n support

    【讨论】:

      【解决方案5】:

      假设我有一个 BaseForm 和一些 error_messages 字典,例如:

      error_messages = {
          'required': 'This field is required',
          'caps': 'This field if case sensitive' 
      }
      

      我想覆盖其中一条错误消息:

      class MySpecialForm(BaseForm):
          def __init__(self, *args, **kwargs):
              super(MySpecialForm, self).__init__(*args, **kwargs)
              self.error_messages['caps'] = 'Hey, that CAPSLOCK is on!!!'
      

      基本上,只需覆盖字典值之一。不过,我不确定它如何与国际化一起使用。

      【讨论】:

      • 如果国际化不是问题,这是一个很好且简单的解决方案。为我工作。
      【解决方案6】:

      来自 ProDjango 书:

      from django.forms import fields, util
      
      
      class LatitudeField(fields.DecimalField):  
          default_error_messages = {
              'out_of_range': u'Value must be within -90 and 90.',
          }
      
      
          def clean(self, value):  
              value = super(LatitudeField, self).clean(value)  
              if not -90 <= value <= 90:  
                  raise util.ValidationError(self.error_messages['out_of_range'])
              return value
      

      【讨论】:

        【解决方案7】:

        嗯,这个问题似乎没有简单的解决方法。

        在浏览 Django 代码时,我发现默认错误消息被硬编码到每个表单字段类中,例如:

        class CharField(Field):
            default_error_messages = {
                'max_length': _(u'Ensure this value has at most %(max)d characters (it has %(length)d).'),
                'min_length': _(u'Ensure this value has at least %(min)d characters (it has %(length)d).'),
            }
        

        而最简单的方法是使用error_messages 参数,所以我不得不编写包装函数:

        def DZForm(name, args = {}):
            error_messages = {
                'required': u'required',
                'invalid': u'invalid',
            }
            if 'error_messages' in args.keys():
                args['error_messages'] = error_messages.update(args['error_messages'])
            else:
                args['error_messages'] = error_messages
            return getattr(forms, name)(**args)
        

        如果有人知道这样做的更优雅的方式,将不胜感激:)

        谢谢!

        【讨论】:

          【解决方案8】:
          from django import forms
          from django.utils.translation import gettext as _
          
          
          class MyForm(forms.Form):
               # create form field
               subject = forms.CharField(required=True)
          
               # override one specific error message and leave the others unchanged
               # use gettext for translation
               subject.error_messages['required'] = _('Please enter a subject below.')
          

          【讨论】:

            【解决方案9】:

            由于此页面出现在搜索中,即使问题很旧,也许值得添加我的 0.02 美元。 (我还在习惯 Stack Overflow 的特殊礼仪。)

            下划线(“_”)是 ugettext_lazy 的别名(如果这是正确的术语);只需查看带有“硬编码”消息的文件顶部的导入语句。然后,Django 的国际化文档应该会有所帮助,例如http://www.djangobook.com/en/2.0/chapter19/

            【讨论】:

              猜你喜欢
              • 2023-03-31
              • 2011-02-25
              • 2021-06-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-03-20
              • 2014-01-05
              • 2012-01-24
              相关资源
              最近更新 更多