form.ValidationError 未显示在模板中
form.ValidationError is not showing in template
我是 Django 的新手,所以请原谅我的一些错误。
我正在尝试为电子邮件创建验证系统并将这些错误(如果有)打印到模板。
澄清一下,我可以创建新用户并重定向到登录页面,只是无法显示错误消息。
如果这是一个微不足道的问题,我深表歉意,但我已经坚持了 2 天了。
我在 youtube: and i have tried to follow this 上试过这个视频,但没用。
forms.py
from django.forms import ModelForm
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django import forms
# This class will overwrite origginal UserCreationForm0
class CreateUserForm(UserCreationForm):
email = forms.EmailField(required = True)
class Meta:
model = User
# this will add email to our register_form
fields = [
'username',
'email',
'password1',
'password2'
]
def clean(self):
cleaned_data = super(CreateUserForm, self).clean()
email = self.cleaned_data.get('email')
if User.objects.filter(email=email).exists():
raise forms.ValidationError('User with same email already exists')
return cleaned_data
views.py
from django.shortcuts import render, redirect
from .forms import CreateUserForm
from django.contrib.auth import login, authenticate, logout
from django.contrib.auth.forms import AuthenticationForm
from django.contrib import messages
# Create your views here.
def registration_page(request):
if request.user.is_authenticated:
return redirect('')
else:
form = CreateUserForm()
if request.method == 'POST':
form = CreateUserForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, 'User has been successefly registered, Please Log In!')
return redirect('accounts:login')
else:
CreateUserForm()
context = {
'form': form
}
return render(request, 'accounts/register.html', context)
register.html
<form class="form-horizontal" method="post">
{% csrf_token %}
<div class="form-group">
<label for="email" class="cols-sm-2 control-label">Your Email</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-envelope fa" aria-hidden="true"></i></span>
{{form.email}}
</div>
</div>
</div>
<div class="form-group">
<label for="username" class="cols-sm-2 control-label">Username</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-users fa" aria-hidden="true"></i></span>
{{form.username}}
</div>
</div>
</div>
<div class="form-group">
<label for="password" class="cols-sm-2 control-label">Password</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
{{form.password1}}
</div>
</div>
</div>
<div class="form-group">
<label for="confirm" class="cols-sm-2 control-label">Confirm Password</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
{{form.password2}}
</div>
</div>
</div>
<p>{{form.email.errors}}</p>
<p>{{form.password.errors}}</p>
<div class="form-group ">
<input type="submit" value="Register" class="btn btn-primary btn-lg btn-block login-button">
</div>
<div class="login-register">
<a href="{% url 'accounts:login' %}">Login</a>
</div>
</form>
clean
方法引发的没有附加字段的错误被添加到 .non_field_errors()
[Django-doc]。因此你应该渲染这些:
<p>{{ form<b>.non_field_errors</b> }}</p>
<p>{{ form<b>.username.errors</b> }}</p>
<p>{{ form<b>.email.errors</b> }}</p>
<p>{{ form<b>.password1.errors</b> }}</p>
<p>{{ form<b>.password2.errors</b> }}</p>
也就是说,(1) 这个错误 是 field-specific,所以你最好在 clean_email
方法中清除它; (2) 如果 model 字段被标记为唯一,Django 模型表单可以检查唯一性。
class CreateUserForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = [
'username',
'email',
'password1',
'password2'
]
def <b>clean_email</b>(self):
email = self.cleaned_data['email']
if User.objects.exclude(<b>pk=self.instance.pk</b>).filter(<b>email=email</b>).exists():
raise forms.ValidationError('User with same email already exists')
return email
如果表单具有已保存在数据库中的包装实例,则此处的 .exclude(…)
很有用。
你可以添加这行
<form class="form-horizontal" method="post">
{% csrf_token %}
<div class="form-group">
<label for="email" class="cols-sm-2 control-label">Your Email</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-envelope fa" aria-hidden="true"></i></span>
{{form.email}}
</div>
</div>
</div>
<div class="form-group">
<label for="username" class="cols-sm-2 control-label">Username</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-users fa" aria-hidden="true"></i></span>
{{form.username}}
</div>
</div>
</div>
<div class="form-group">
<label for="password" class="cols-sm-2 control-label">Password</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
{{form.password1}}
</div>
</div>
</div>
<div class="form-group">
<label for="confirm" class="cols-sm-2 control-label">Confirm Password</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
{{form.password2}}
</div>
</div>
</div>
<p>{{form.email.errors}}</p>
<p>{{form.password2.errors}}</p>
<p>{{form.username.errors}}</p>
<div class="form-group ">
<input type="submit" value="Register" class="btn btn-primary btn-lg btn-block login-button">
</div>
<div class="login-register">
<a href="{% url 'accounts:login' %}">Login</a>
</div>
</form>
我是 Django 的新手,所以请原谅我的一些错误。
我正在尝试为电子邮件创建验证系统并将这些错误(如果有)打印到模板。
澄清一下,我可以创建新用户并重定向到登录页面,只是无法显示错误消息。
如果这是一个微不足道的问题,我深表歉意,但我已经坚持了 2 天了。
我在 youtube: and i have tried to follow this
forms.py
from django.forms import ModelForm
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django import forms
# This class will overwrite origginal UserCreationForm0
class CreateUserForm(UserCreationForm):
email = forms.EmailField(required = True)
class Meta:
model = User
# this will add email to our register_form
fields = [
'username',
'email',
'password1',
'password2'
]
def clean(self):
cleaned_data = super(CreateUserForm, self).clean()
email = self.cleaned_data.get('email')
if User.objects.filter(email=email).exists():
raise forms.ValidationError('User with same email already exists')
return cleaned_data
views.py
from django.shortcuts import render, redirect
from .forms import CreateUserForm
from django.contrib.auth import login, authenticate, logout
from django.contrib.auth.forms import AuthenticationForm
from django.contrib import messages
# Create your views here.
def registration_page(request):
if request.user.is_authenticated:
return redirect('')
else:
form = CreateUserForm()
if request.method == 'POST':
form = CreateUserForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, 'User has been successefly registered, Please Log In!')
return redirect('accounts:login')
else:
CreateUserForm()
context = {
'form': form
}
return render(request, 'accounts/register.html', context)
register.html
<form class="form-horizontal" method="post">
{% csrf_token %}
<div class="form-group">
<label for="email" class="cols-sm-2 control-label">Your Email</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-envelope fa" aria-hidden="true"></i></span>
{{form.email}}
</div>
</div>
</div>
<div class="form-group">
<label for="username" class="cols-sm-2 control-label">Username</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-users fa" aria-hidden="true"></i></span>
{{form.username}}
</div>
</div>
</div>
<div class="form-group">
<label for="password" class="cols-sm-2 control-label">Password</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
{{form.password1}}
</div>
</div>
</div>
<div class="form-group">
<label for="confirm" class="cols-sm-2 control-label">Confirm Password</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
{{form.password2}}
</div>
</div>
</div>
<p>{{form.email.errors}}</p>
<p>{{form.password.errors}}</p>
<div class="form-group ">
<input type="submit" value="Register" class="btn btn-primary btn-lg btn-block login-button">
</div>
<div class="login-register">
<a href="{% url 'accounts:login' %}">Login</a>
</div>
</form>
clean
方法引发的没有附加字段的错误被添加到 .non_field_errors()
[Django-doc]。因此你应该渲染这些:
<p>{{ form<b>.non_field_errors</b> }}</p>
<p>{{ form<b>.username.errors</b> }}</p>
<p>{{ form<b>.email.errors</b> }}</p>
<p>{{ form<b>.password1.errors</b> }}</p>
<p>{{ form<b>.password2.errors</b> }}</p>
也就是说,(1) 这个错误 是 field-specific,所以你最好在 clean_email
方法中清除它; (2) 如果 model 字段被标记为唯一,Django 模型表单可以检查唯一性。
class CreateUserForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = [
'username',
'email',
'password1',
'password2'
]
def <b>clean_email</b>(self):
email = self.cleaned_data['email']
if User.objects.exclude(<b>pk=self.instance.pk</b>).filter(<b>email=email</b>).exists():
raise forms.ValidationError('User with same email already exists')
return email
如果表单具有已保存在数据库中的包装实例,则此处的 .exclude(…)
很有用。
你可以添加这行
<form class="form-horizontal" method="post">
{% csrf_token %}
<div class="form-group">
<label for="email" class="cols-sm-2 control-label">Your Email</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-envelope fa" aria-hidden="true"></i></span>
{{form.email}}
</div>
</div>
</div>
<div class="form-group">
<label for="username" class="cols-sm-2 control-label">Username</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-users fa" aria-hidden="true"></i></span>
{{form.username}}
</div>
</div>
</div>
<div class="form-group">
<label for="password" class="cols-sm-2 control-label">Password</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
{{form.password1}}
</div>
</div>
</div>
<div class="form-group">
<label for="confirm" class="cols-sm-2 control-label">Confirm Password</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
{{form.password2}}
</div>
</div>
</div>
<p>{{form.email.errors}}</p>
<p>{{form.password2.errors}}</p>
<p>{{form.username.errors}}</p>
<div class="form-group ">
<input type="submit" value="Register" class="btn btn-primary btn-lg btn-block login-button">
</div>
<div class="login-register">
<a href="{% url 'accounts:login' %}">Login</a>
</div>
</form>