【问题标题】:How do I customize Django Form ValidationErrors for built-in forms?如何为内置表单自定义 Django Form ValidationErrors?
【发布时间】:2012-06-23 04:28:09
【问题描述】:

我正在利用这些内置的 Django 表单,但遇到了一个小问题。

  • 类 AdminPasswordChangeForm
  • 类 AuthenticationForm
  • 类 PasswordChangeForm
  • 类 PasswordResetForm
  • 类 SetPasswordForm
  • 类 UserChangeForm
  • 类 UserCreationForm

例如,UserCreationForm 会生成多个验证错误,我可以使用诸如 {{ form.errors }} 之类的标签,甚至是与特定字段相关的标签(例如 {{ form.username.errors }})在我的模板中显示这些错误。

我知道如何自定义这些错误消息的样式,但是如何自定义文本呢?我已经能够使用{% if form.password.errors %} 之类的条件语句简单地检查是否存在错误,并将我自己的自定义文本放在该块中。但是,这让我对引发的错误类型视而不见。

例如,我希望能够确定触发的错误是duplicate_username 还是password_mismatch,以便我可以在模板中编写自己的错误。

任何帮助将不胜感激!

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    一般来说,你可以像下面这样自定义清理方法:

    class EventDetailsForm(form.ModelForm):
        class Meta:
            model = Event
            fields = ('name',)
            layout = (
                    Fieldset('',
                    'name',),
                    )
    
        def clean_name(self):
            event_name = self.cleaned_data['name']
            if Event.objects.filter(name=event_name, status='Live').\
                    exclude(id=self.instance.id).exists():
                raise forms.ValidationError('This Name is already in use')
            else:
                return event_name
    

    所以要重用 django 的表单,只需将其子类化,添加额外的验证逻辑并在您的视图函数中调用该表单。

    【讨论】:

    • 这是一项额外的检查吗?还是在原始表单的子类中添加 clean 方法会覆盖/替换现有的 clean 方法?
    • 它将覆盖它。因此,您可以复制现有的验证方法并添加您自己的自定义逻辑。不是超级干燥,但可以完成工作。
    • 不确定我是否理解错了,但我只是尝试创建UserCreationFormAuthenticationForm 的子类,原始逻辑仍然完全存在。只有当我创建具有相同名称的函数来替换原来的函数时,它才会改变。
    • 这正是预期的行为和我的意思。 Som 子类化表单,将 django 中的 clean 方法复制粘贴到您的自定义表单中。将您需要的额外自定义验证逻辑添加到该干净方法中。
    猜你喜欢
    • 2010-12-26
    • 1970-01-01
    • 2018-02-22
    • 2018-10-02
    • 2011-07-07
    • 1970-01-01
    • 2015-12-12
    • 2012-05-07
    • 2011-12-30
    相关资源
    最近更新 更多