【问题标题】:Django 1.6 error_messages in Modelform Meta class do not workModelform Meta 类中的 Django 1.6 error_messages 不起作用
【发布时间】:2014-04-11 04:24:40
【问题描述】:

我正在使用 Django 1.6.2 和在 ModelForms as mentioned in this question 上的 1.6 版本中添加的新元选项,表单上的错误不像我设置的那样显示。

我的代码:

模型表单

class UserRegisterForm(forms.ModelForm):
    """A form for creating new users. Includes all the required
    fields, plus a repeated password."""
    password = forms.CharField(label='Password', widget=forms.PasswordInput)

    class Meta:
        model = MyUser
        fields = ('email','first_name','last_name')

        error_messages = {
            'email': {
                    'invalid': u"Hai",
                    'required': u"Sup",
            },
        }

    def save(self, commit=True):
        # Save the provided password in hashed format
        user = super(UserRegisterForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password"])
        if commit:
            user.save()
        return user

模板

<div class="form-group emailgroup {% if form.email.errors %}has-error has-feedback{% endif %}">
      <label for="emailfield">Dirección de correo electrónico</label>
      <input type="email" class="form-control" id="emailfield" name="email" required placeholder="¿Cuál es tu dirección de correo electrónico?">
      {% if form.email.errors %}<span class="glyphicon glyphicon-remove form-control-feedback"></span>
      <span class="help-block">{{ form.email.errors }}</span>
      {% endif %}
</div>

请注意模板中我打印字段错误的以下几行。

{% if form.email.errors %}<span class="glyphicon glyphicon-remove form-control-feedback"></span>
      <span class="help-block">{{ form.email.errors }}</span>
{% endif %}

但我仍然收到预定义的错误消息。我做错了什么?

【问题讨论】:

  • 您能在这篇文章中验证您的缩进吗?我不确定这实际上是您的代码(会导致问题的原因)还是只是创建问题时的复制/粘贴/格式问题。
  • 谢谢,我没注意到。这实际上是一个复制粘贴问题,它在我的代码中正确缩进。
  • 感谢您的澄清。另一个问题:“我仍然收到预定义的错误消息”是什么意思?它在哪里显示?输入字段的 HTML5 验证或来自服务器端的与字段相关的错误消息?
  • 我们收到与字段相关的错误消息。我正在使用已经存在的电子邮件强制表单,并且 {{ form.email.errors }} 打印默认消息而不是 u"Hai"

标签: django django-forms


【解决方案1】:

通常将错误消息定义为类属性,而不是在内部 Meta 中。接下来是为您的电子邮件字段设置一个干净的方法,如果给定的电子邮件无效,它将引发 ValidationError:

error_messages = {
    "invalid_email": "Email is invalid.",
}

def clean_email(self):
    email = self.cleaned_data["email"]

    # Check the content of email here
    ...

    # If not valid raise ValidationException referencing the predefined error message
    ...
    raise ValidationError(self.error_messages["invalid_email"], code="invalid_email",)

    # If valid return value
    return email

【讨论】:

  • 像魅力一样工作。非常感谢! :)
  • 但这令人困惑。该文档没有说明必须调用自定义 clean_xyz() 方法。我的理解是,通过在 Meta 类中简单地定义一个 error_messages 字典,默认消息将被新定义的消息替换。我错过了什么吗?
猜你喜欢
  • 2022-06-17
  • 1970-01-01
  • 2018-05-08
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 2010-09-22
相关资源
最近更新 更多