Python Django:无法验证UserCreationForm
下面是我的forms.py的内容Python Django:无法验证UserCreationForm,python,django,forms,Python,Django,Forms,下面是我的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 = form
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
我能够打印表单(包括字段email、first_name和last_name)并成功注册用户唯一的问题是,它没有执行验证步骤。(代码位于“#电子邮件id验证------------”下方)
即使域不是“tmail”,它也会在不引发任何验证错误的情况下接受它&然后将用户注册到数据库中。如果您需要更多信息,请帮助并告诉我。现在用
save()
方法验证电子邮件已经太晚了。Django允许您通过定义方法clean\uu
来验证单个字段。验证表单时将调用此函数
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
有关更多信息,请参阅上的文档。为什么要在“保存”中进行验证?所有验证都必须在保存之前进行,这样,如果保存时出现异常,则很可能是代码中的错误。表单特别具有“干净”方法,尤其是用于此目的。对于特定的字段验证,可以使用“clean{field\u name}”。虽然如果您的验证依赖于多个字段,您需要使用“clean”方法。使用
clean()
方法或email\u clean()
方法来验证电子邮件字段。是不是我们错误地缩进了您的save
方法?调试您的代码,实际包含域变量的内容。嗨。。根据Alasdair的建议,我已经应用了clean_*功能&它现在正在验证电子邮件id。我现在唯一的问题是,它没有在表单中打印验证错误“域必须是“tmail”,以防域不是“tmail”,表单中会存在错误。错误使用域密钥dict