django 表单 non_field_errors 自定义
django forms non_field_errors customizing
我想在 Django 表单中有自己的错误,但我不能。如您所见,我定义了自己的 error_messages 但 Django 仍在使用它自己的错误。
应用程序帐户/forms.py:
from django import forms
error_messages_email = {
'required': 'please Fill-out this field',
'invalid': 'invalid format for email',
'max_length': 'max length is 40 chars',
}
error_messages = {
'required': 'please Fill-out this field',
'invalid': 'fields format is not valid',
'max_length': 'max_length is 30 chars',
'min_length': 'password should be at least 8 Chars',
}
class LoginForm(forms.Form):
username = forms.CharField(error_messages=error_messages, max_length=30,
widget=forms.TextInput(attrs={'class': 'form-control',
'placeholder': 'Username'}))
password = forms.CharField(error_messages=error_messages, min_length=8, max_length=30,
widget=forms.PasswordInput(attrs={'class': 'form-control',
'placeholder': 'Password'}))
class SignupForm(forms.Form):
username = forms.CharField(error_messages=error_messages, max_length=30,
widget=forms.TextInput(attrs={'class': 'form-control',
'placeholder': 'Username'}))
email = forms.EmailField(error_messages=error_messages_email, max_length=40,
widget=forms.EmailInput(attrs={'class': 'form-control',
'placeholder': 'Email'}))
password = forms.CharField(error_messages=error_messages, min_length=8, max_length=30,
widget=forms.PasswordInput(attrs={'class': 'form-control',
'placeholder': 'Password'}))
这是我的应用程序模板/signup.html:
{% extends 'main.html' %}
{% block title %} Join {% endblock %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
{{ form.non_field_errors }}
{{ form.username.errors }}
<label for="{{ form.username.id_for_label }}">Username:</label>
{{ form.username }}<br>
{{ form.email.errors }}
<label for="{{ form.email.id_for_label }}">E-mail:</label>
{{ form.email }}<br>
{{ form.password.errors }}
<label for="{{ form.password.id_for_label }}">Password:</label>
{{ form.password }}<br>
<input type="submit" value="signup" class="btn btn-primary" >
</form>
{% endblock %}
唯一的问题是其他部分工作正常的错误,在浏览器中我也将 max_length 更改为 50 并传递给它一个 50 个字符的密码并提交它,它工作正常并显示我自己的错误.
您只能将 error_messages
关键字参数用于 Model
或 ModelForm
。
由于您只是在使用标准 Form
,因此不会出现您期望的行为。
您需要更改 LoginForm
才能继承 ModelForm
。例如:
class LoginForm(forms.ModelForm):
username = forms.CharField(error_messages=error_messages, max_length=30,
widget=forms.TextInput(attrs={'class': 'form-control',
'placeholder': 'Username'}))
password = forms.CharField(error_messages=error_messages, min_length=8, max_length=30,
widget=forms.PasswordInput(attrs={'class': 'form-control',
'placeholder': 'Password'}))
class Meta:
model=User
fields = ('username','password')
关于答案,我做错的是我没有关闭模板验证,所以它没有使用 django 验证错误。只需在您定义表单模板的地方执行此操作:
<form action="" method="post" novalidate>
将 novalidate 放在表单标签的末尾
我想在 Django 表单中有自己的错误,但我不能。如您所见,我定义了自己的 error_messages 但 Django 仍在使用它自己的错误。
应用程序帐户/forms.py:
from django import forms
error_messages_email = {
'required': 'please Fill-out this field',
'invalid': 'invalid format for email',
'max_length': 'max length is 40 chars',
}
error_messages = {
'required': 'please Fill-out this field',
'invalid': 'fields format is not valid',
'max_length': 'max_length is 30 chars',
'min_length': 'password should be at least 8 Chars',
}
class LoginForm(forms.Form):
username = forms.CharField(error_messages=error_messages, max_length=30,
widget=forms.TextInput(attrs={'class': 'form-control',
'placeholder': 'Username'}))
password = forms.CharField(error_messages=error_messages, min_length=8, max_length=30,
widget=forms.PasswordInput(attrs={'class': 'form-control',
'placeholder': 'Password'}))
class SignupForm(forms.Form):
username = forms.CharField(error_messages=error_messages, max_length=30,
widget=forms.TextInput(attrs={'class': 'form-control',
'placeholder': 'Username'}))
email = forms.EmailField(error_messages=error_messages_email, max_length=40,
widget=forms.EmailInput(attrs={'class': 'form-control',
'placeholder': 'Email'}))
password = forms.CharField(error_messages=error_messages, min_length=8, max_length=30,
widget=forms.PasswordInput(attrs={'class': 'form-control',
'placeholder': 'Password'}))
这是我的应用程序模板/signup.html:
{% extends 'main.html' %}
{% block title %} Join {% endblock %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
{{ form.non_field_errors }}
{{ form.username.errors }}
<label for="{{ form.username.id_for_label }}">Username:</label>
{{ form.username }}<br>
{{ form.email.errors }}
<label for="{{ form.email.id_for_label }}">E-mail:</label>
{{ form.email }}<br>
{{ form.password.errors }}
<label for="{{ form.password.id_for_label }}">Password:</label>
{{ form.password }}<br>
<input type="submit" value="signup" class="btn btn-primary" >
</form>
{% endblock %}
唯一的问题是其他部分工作正常的错误,在浏览器中我也将 max_length 更改为 50 并传递给它一个 50 个字符的密码并提交它,它工作正常并显示我自己的错误.
您只能将 error_messages
关键字参数用于 Model
或 ModelForm
。
由于您只是在使用标准 Form
,因此不会出现您期望的行为。
您需要更改 LoginForm
才能继承 ModelForm
。例如:
class LoginForm(forms.ModelForm):
username = forms.CharField(error_messages=error_messages, max_length=30,
widget=forms.TextInput(attrs={'class': 'form-control',
'placeholder': 'Username'}))
password = forms.CharField(error_messages=error_messages, min_length=8, max_length=30,
widget=forms.PasswordInput(attrs={'class': 'form-control',
'placeholder': 'Password'}))
class Meta:
model=User
fields = ('username','password')
关于答案,我做错的是我没有关闭模板验证,所以它没有使用 django 验证错误。只需在您定义表单模板的地方执行此操作:
<form action="" method="post" novalidate>
将 novalidate 放在表单标签的末尾