为Django ModelChoiceField自定义验证用户的电子邮件

时间:2016-02-13 19:45:53

标签: python django validation

在我的模型中,我设置了一个自定义模型(CodeUser),其中包含User模型django.contrib.auth的外键。我实际上使用django-auth-ldap,但User模型是相同的。然后我有一个Code模型,其中custodian字段是特定CodeUser的外键。

class CodeUser(models.Model):
    user = models.ForeignKey('User')
    # Other fields...

class Code(models.Model):
    custodian = models.ForeignKey('CodeUser')
    # Other fields...

我正在为ModelForm模型使用Code,并希望表单接受CodeUser字段custodian的电子邮件地址。我认为只需使用to_field_name的{​​{1}}选项就可以完成此操作。

但是,如果用户不存在,我希望能够创建用户。我这样做是通过进行ModelChoiceField查询来确保电子邮件可以与用户关联,然后使用LDAP的{​​{1}}方法。

填充用户的过程工作正常,我只是在弄清楚这个代码应该放在我的django应用程序中的哪个位置。我尝试创建自定义字段populate,然后将其用于代码模型窗格中django-auth-ldap字段的class。我为我的字段实现了自定义field_classes方法,但在custodian ModelForm验证期间永远不会调用此方法。似乎验证仅针对ModelForms降级为模型。

validate

最后,我的问题是,通过电子邮件地址进行Code验证/填充的代码应该放在哪里?还有一些其他形式需要这个过程,所以我认为自定义字段类最有意义。

1 个答案:

答案 0 :(得分:0)

你可以在两个不同的地方做。您可以覆盖CodeForm的change_form.html并通过JavaScript执行。

或者我过去所做的是在ModelForm中完成并覆盖“def clean”函数。这是我用自定义更改密码表单执行此操作的示例。

def clean(self):
    cleaned_data = super(ChangePasswordForm, self).clean()
    oldpass = cleaned_data.get('oldpassword')
    if not self.user.check_password(oldpass):
        raise forms.ValidationError("Invalid Password")
    pass1 = cleaned_data.get('password1')
    pass2 = cleaned_data.get('password2')

    if pass1 != pass2:
        raise forms.ValidationError("Passwords do not match")

也应该在ModelForm中工作。

https://docs.djangoproject.com/en/1.9/ref/forms/validation/