Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:无法验证UserCreationForm_Python_Django_Forms - Fatal编程技术网

Python Django:无法验证UserCreationForm

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

下面是我的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
我能够打印表单(包括字段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