Python 在注册中验证电子邮件不会在Django中引发validationError?
在我的Python 在注册中验证电子邮件不会在Django中引发validationError?,python,django,django-forms,django-views,django-registration,Python,Django,Django Forms,Django Views,Django Registration,在我的注册中,我强制要求电子邮件id是唯一的。也就是说,如果存在具有该电子邮件id的用户,我想引发aforms.ValidationError 这是我的表单.py: from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User class MyRegistrationForm(UserCreationForm): #define fields
注册
中,我强制要求电子邮件id
是唯一的。也就是说,如果存在具有该电子邮件id的用户,我想引发
aforms.ValidationError
这是我的表单.py
:
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class MyRegistrationForm(UserCreationForm):
#define fields
email=forms.EmailField(required=True)
class Meta:
model=User
fields=('username','email','password1','password2')
def clean_email(self):
email = self.cleaned_data["email"]
try:
user = User.objects.get(email=email)
print user.email
print user.username
raise forms.ValidationError("This email address already exists. Did you forget your password?")
except User.DoesNotExist:
return email
def save(self, commit=True):
user = super(MyRegistrationForm, self).save(commit=False)
user.email=self.cleaned_data["email"]
if commit:
user.save()
return user
def register_user(request):
if request.method=='POST':
form=MyRegistrationForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, "Thank you for signing up")
return HttpResponseRedirect("/accounts/register_success")
args={}
args['form']=MyRegistrationForm()
return render(request,"register.html",args)
我的视图.py
:
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class MyRegistrationForm(UserCreationForm):
#define fields
email=forms.EmailField(required=True)
class Meta:
model=User
fields=('username','email','password1','password2')
def clean_email(self):
email = self.cleaned_data["email"]
try:
user = User.objects.get(email=email)
print user.email
print user.username
raise forms.ValidationError("This email address already exists. Did you forget your password?")
except User.DoesNotExist:
return email
def save(self, commit=True):
user = super(MyRegistrationForm, self).save(commit=False)
user.email=self.cleaned_data["email"]
if commit:
user.save()
return user
def register_user(request):
if request.method=='POST':
form=MyRegistrationForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, "Thank you for signing up")
return HttpResponseRedirect("/accounts/register_success")
args={}
args['form']=MyRegistrationForm()
return render(request,"register.html",args)
当我用相同的电子邮件id注册一个用户时,它不会抛出validationError
。但只需返回register.html
,但不会添加重复用户
为什么它不抛出validationError
我在forms.py(上图)
中添加了两个print
语句,用于print
我从User.object.get(email=email)
获得的用户名
和email id
中正确打印以前注册用户的姓名
。因此,控件将继续运行到那里,但不会抛出validationError
编辑:
我还尝试创建一个全新的用户
,但是有passoword
字段不匹配
。
不过,我没有收到任何错误消息。但它只是重定向到register.html
{% extends "base.html" %}
{% block content %}
<h2>Register</h2>
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="register"/>
</form>
{% endblock %}
编辑:
template/register.html
{% extends "base.html" %}
{% block content %}
<h2>Register</h2>
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="register"/>
</form>
{% endblock %}
{%extends“base.html”%}
{%block content%}
登记
{%csrf_令牌%}
{{form.as_p}}
{%endblock%}
在此模板中,错误
自动显示在发生错误的字段
的正上方。我不必做{{form.email.error}。但是,我没有办法自定义错误
。例如bold
或一些css。这可能吗?Django表单捕获验证错误
异常,并将错误添加到表单\u错误
dict。此代码来自Django基表单。\u清除字段
方法:
try:
# ...
if hasattr(self, 'clean_%s' % name):
value = getattr(self, 'clean_%s' % name)()
self.cleaned_data[name] = value
except ValidationError as e:
self._errors[name] = self.error_class(e.messages)
if name in self.cleaned_data:
del self.cleaned_data[name]
所以,通过引发ValidationError
exception,您告诉django在清理字段中添加错误,并使表单无效
您可以访问模板中的字段错误:
{{ form.field_name.errors }}
并迭代一个字段错误(django文档):
并显示非字段错误:
{{ form.non_field_errors }}
更新:您应该在视图中添加else
块。如果没有else
,您将始终创建新表单:
def register_user(request):
if request.method=='POST':
form=MyRegistrationForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, "Thank you for signing up")
return HttpResponseRedirect("/accounts/register_success")
else:
form = MyRegistrationForm()
args={}
args['form'] = form
return render(request,"register.html",args)
这闻起来像一个html模板,它不会在表单中显示错误。尝试在模板中添加{{form.errors}}
,看看会发生什么。我将其添加到模板中仍然没有帮助需要什么修复?我不清楚你的回答,我尝试了{{{form.email.errors}}
,但没有给出任何信息。ValidationError
是否重定向到寄存器
页面!这有帮助。默认情况下,用户模型允许唯一用户名。i、 如果我尝试注册一个新用户,使用相同的用户名,它将不会注册,但我想我们必须显式地签入模板,以抛出form.errors。但是{{form.field\u name.errors}}
是一个列表还是一个错误,还是仅仅是一个字符串版本?@热切学习{{{form.field\u name.errors}}是可移植的,我添加了一个很有帮助的示例。如果我在所有字段中都有表单错误,我如何遍历所有错误。由于field.email.error
或field.username.error
特定于电子邮件和用户名字段