【问题标题】:Django: Not able to validate UserCreationFormDjango:无法验证 UserCreationForm
【发布时间】:2015-08-27 08:17:19
【问题描述】:

下面是我的forms.py的内容

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

class RegistrationForm(UserCreationForm):

    email = forms.EmailField(required=True)
    first_name = forms.CharField(max_length=20, required=True)
    last_name = forms.CharField(max_length=20, required=True)

    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2', 'first_name', 'last_name')

        def save(self, commit=True):
            user = super(UserCreationForm, self).save(commit=False)
            user.email = self.cleaned_data['email']
            user.first_name = self.cleaned_data['first_name']
            user.last_name = self.cleaned_data['last_name']
#validation of email id----------
            email1 = user.email
            (fisrt, second,) = email1.split("@")
            (domain, exn,) = second.split(".")
            if not domain == "tmail":
                raise forms.ValidationError("Domain must be 'tmail'")

            if commit:
                user.save()
            return user

我能够打印表单(包括字段电子邮件、名字和姓氏)并成功注册用户我唯一的问题是,它没有执行验证步骤。 (“#validation of email id----------”下面的代码) 即使域不是“tmail”,它也会接受它而不会引发任何验证错误,然后将用户注册到数据库中。如果您需要更多信息,请帮助并告诉我。

【问题讨论】:

  • 使用clean() 方法或email_clean() 方法验证电子邮件字段。
  • 是我们的save 方法缩进错误吗?
  • 调试你的代码,实际上包含你的 domain 变量。

标签: python django forms


【解决方案1】:

save() 方法中验证电子邮件为时已晚。 Django 允许您通过定义方法clean_<fieldname> 来验证各个字段。这将在验证表单时调用。

def clean_email(self):
    email = self.cleaned_data['email']
    (first, second,) = email1.split("@")
    (domain, exn,) = second.split(".")
    if domain != "tmail":
        raise forms.ValidationError("Domain must be 'tmail'")
    return email 

有关更多信息,请参阅cleaning a specific field attribute 上的文档。

【讨论】:

    【解决方案2】:

    为什么要在保存中进行验证?所有验证都必须在保存之前进行,这样如果保存时出现任何异常,则很可能是代码中的错误。表单专门有“干净”的方法,特别是为此目的。对于特定的字段验证,您可以使用“clean_{field_name}”。虽然如果你的验证依赖于多个字段,你需要使用“干净”的方法。

    【讨论】:

    • 嗨.. 根据 Alasdair 的建议,我已经应用了 clean_* 函数,它现在正在验证电子邮件 ID。我现在唯一的问题是,如果域不是'tmail',它不会在表单中打印验证错误“域必须是'tmail'”
    • 带有域键的 form.errors dict 中会存在错误
    猜你喜欢
    • 2021-05-07
    • 2013-05-09
    • 2011-10-04
    • 2018-03-01
    • 1970-01-01
    • 2022-01-21
    • 2020-10-14
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多