2012-06-20 27 views
0

我利用了这些内置的Django表单,并且遇到了一个小问题。如何为内置表单自定义Django表单验证错误?

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

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

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

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

任何帮助,将不胜感激!

回答

2

一般来说,你可以自定义像下面的清洁方法:

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的形式,只是它的子类,添加额外的验证逻辑和调用的形式在您的视图功能。

+1

这是一个额外的检查?或者,在原始形式的子类中添加干净的方法是否覆盖/替换现有的清洁方法? –

+1

它会覆盖它。所以你可以复制现有的验证方法并添加你自己的定制逻辑。不是超级干,但完成了工作。 – super9

+0

不知道我是否误解了一些东西,但我只是尝试创建'UserCreationForm'和'AuthenticationForm'的子类,并且原始逻辑仍然完全存在。它只会改变,如果我创建具有相同名称的函数来替换原来的函数。 –