python - Django Forms - 验证错误显示两次
问题描述
我想为表单中的字段显示一些验证错误:
- 如果电子邮件已经存在
- 如果用户名少于 8 个字符
- 如果密码不匹配
- 如果密码字段少于 8 个字符
表格.py
class RegisterForm(forms.Form):
username = forms.CharField(widget = forms.TextInput(attrs ={"class":"form-control mb-2 mr-sm-2" ,"placeholder":"username"}))
email = forms.EmailField(widget = forms.TextInput(attrs = {"class":"form-control mb-2 mr-sm-2"}))
password = forms.CharField(widget = forms.PasswordInput(attrs = {"class":"form-control mb-2 mr-sm-2"}))
password2 = forms.CharField(label = "Confirm Password",widget = forms.PasswordInput(attrs = {"class":"form-control mb-2 mr-sm-2"}))
def clean(self):
data = self.cleaned_data
password = self.cleaned_data.get('password')
password2 = self.cleaned_data.get('password2')
if password2!=password:
raise forms.ValidationError("Passwords dont match")
if len(password)<8:
raise forms.ValidationError("Password must be atleast 8 characters long")
return data
def clean_username(self):
username = self.cleaned_data.get('username')
qs = User.objects.filter(username = username)
if qs.exists():
raise forms.ValidationError("username exists")
return username
def clean_email(self):
email = self.cleaned_data.get('email')
qs = User.objects.filter(email = email)
if qs.exists():
raise forms.ValidationError("email exists",code="error1")
return email'''
注册.html
<form method="POST" class="was-validated">
{% csrf_token %}
<div class="form-group">
{% if form.errors %}
{% for field in form %}
{% for error in field.errors %}
<div class="alert alert-danger">
<strong>{{ error|escape }}</strong>
</div>
{% endfor %}
{% endfor %}
{% for error in form.non_field_errors %}
<div class="alert alert-danger">
<strong>{{ error|escape }}</strong>
</div>
{% endfor %}
{%endif%}
{{form.as_p}}
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>'''
我希望验证错误只显示一次。我不希望每个字段上方的错误。我只希望所有错误都在顶部。
解决方案
您可以使用 self.add_error 而不是 raise forms.ValidationError :
class UserRegisterForm(forms.Form):
# [...stuff...]
password = forms.CharField(widget=forms.PasswordInput)
password_confirm = forms.CharField(widget=forms.PasswordInput)
def clean(self):
'''Required custom validation for the form.'''
super(forms.Form,self).clean()
if 'password' in self.cleaned_data and 'password_confirm' in self.cleaned_data:
if self.cleaned_data['password'] != self.cleaned_data['password_confirm']:
self._errors['password'] = [u'Passwords must match.']
self._errors['password_confirm'] = [u'Passwords must match.']
return self.cleaned_data
您可以在模板中使用:
{% for error in form.non_field_errors %}
{{error}}
{% endfor %}
您在表单上设置 _errors['FIELDNAME'] 以标记无效字段。(请记住,clean 方法必须返回 clean_data 成员。这让我在后面咬了一会儿。)
如需更多学习,您可以看到这个
推荐阅读
- python - 仅将最后一个值输入到 postgres 数据库的脚本
- php - Heroku 在部署时发送错误超时并增加文件
- java - 将特定字段/变量附加到正在实现的接口
- javascript - iframe 在收到 postMessage 内容后加载所有内容
- java - DeferedResult 和 CompletableFeature 之间的区别
- python - 与 GlobalAveragePooling2D() 不兼容的 Dims
- urllib2 - Pytube 出错:signature = cipher.get_signature(js, stream['s']) KeyError: 's'
- google-cloud-platform - GCP 默认防火墙规则是否存在安全问题?
- architecture - 领域驱动设计中的值或实体类型的存储库
- matlab - 在 Matlab 中绘制真彩色 Sentinel-2A 图像