django 表单字段验证和错误显示
django form field validation and error display
我想制作一个注册页面,就像:
当用户点击注册时,我想检查两个密码是否相同,如果不相同,在"confirm password"后给出错误信息。这是我的代码:
forms.py
class SignupForm(forms.Form):
username = forms.CahrField(
label=_("username"),
max_length=30,
)
email = forms.EmailField(label=_('email'),)
password_1 = forms.CharField(
label=_("password"),
widget=forms.PasswordInput,
)
password_2 = forms.CharField(
label=_("password_confirmed"),
widget=forms.PasswordInput,
)
def clean_password_2(self):
password_1 = self.cleaned_data.get("password_1")
password_2 = self.cleaned_data.get("password_2")
if password_1 and password_2 and password_1 != password_2:
raise forms.ValidationError(_('password confirm failed'))
return password_2
signup.html
<form method="post" action="{% url 'accounts:signup_post' %}">
{% csrf_token %}
<table>
{% for field in form %}
<tr>
<td>{{ field.label_tag }}</td>
<td>{{ field }}</td>
<td>{{ field.errors }}</td>
</tr>
{% endfor %}
</table>
<input type='submit' id="submit" value={% trans "signup" %}>
<a href="{% url 'accounts:login' %}">{% trans "Already have accounts?" %}</a>
</form>
views.py
def signup_post(request):
if request.method == 'POST':
signup_form = forms.SignupForm(request.POST)
if signup_form.is_valid():
signup_info = signup_form.cleaned_data
username = signup_info['username']
email = signup_info['email']
password = signup_info['password_1']
user = User.objects.create_user(
username=username,
email=email,
password=password)
user.save()
# redirect to main page(not written so far)
else:
# I guess something wrong here, but no idea how to fix it.
return redirect(reverse("accounts:signup"))
else:
signup_form = forms.SignupForm()
return render(reverse("accounts:signup"), {'form': signup_form})
谁能帮帮我?
谢谢!
您的重定向调用没有显示错误,因为它已经失去了它的上下文。不重定向而是打印错误以进行日志记录就足够了。
而不是:
return redirect(reverse("accounts:signup"))
尝试:
print "Invalid Registration Attempt: user:{0} email:{1}".format(username, email)
当渲染时表单出现在上下文中时,将显示错误:
return render(reverse("accounts:signup"), {'form': signup_form})
您应该完全删除第一个 else
子句。如果表单无效,则不应重定向,而应跳转到最后的 render
调用,该调用会重新显示表单以及错误。
我想制作一个注册页面,就像:
当用户点击注册时,我想检查两个密码是否相同,如果不相同,在"confirm password"后给出错误信息。这是我的代码:
forms.py
class SignupForm(forms.Form):
username = forms.CahrField(
label=_("username"),
max_length=30,
)
email = forms.EmailField(label=_('email'),)
password_1 = forms.CharField(
label=_("password"),
widget=forms.PasswordInput,
)
password_2 = forms.CharField(
label=_("password_confirmed"),
widget=forms.PasswordInput,
)
def clean_password_2(self):
password_1 = self.cleaned_data.get("password_1")
password_2 = self.cleaned_data.get("password_2")
if password_1 and password_2 and password_1 != password_2:
raise forms.ValidationError(_('password confirm failed'))
return password_2
signup.html
<form method="post" action="{% url 'accounts:signup_post' %}">
{% csrf_token %}
<table>
{% for field in form %}
<tr>
<td>{{ field.label_tag }}</td>
<td>{{ field }}</td>
<td>{{ field.errors }}</td>
</tr>
{% endfor %}
</table>
<input type='submit' id="submit" value={% trans "signup" %}>
<a href="{% url 'accounts:login' %}">{% trans "Already have accounts?" %}</a>
</form>
views.py
def signup_post(request):
if request.method == 'POST':
signup_form = forms.SignupForm(request.POST)
if signup_form.is_valid():
signup_info = signup_form.cleaned_data
username = signup_info['username']
email = signup_info['email']
password = signup_info['password_1']
user = User.objects.create_user(
username=username,
email=email,
password=password)
user.save()
# redirect to main page(not written so far)
else:
# I guess something wrong here, but no idea how to fix it.
return redirect(reverse("accounts:signup"))
else:
signup_form = forms.SignupForm()
return render(reverse("accounts:signup"), {'form': signup_form})
谁能帮帮我? 谢谢!
您的重定向调用没有显示错误,因为它已经失去了它的上下文。不重定向而是打印错误以进行日志记录就足够了。
而不是:
return redirect(reverse("accounts:signup"))
尝试:
print "Invalid Registration Attempt: user:{0} email:{1}".format(username, email)
当渲染时表单出现在上下文中时,将显示错误:
return render(reverse("accounts:signup"), {'form': signup_form})
您应该完全删除第一个 else
子句。如果表单无效,则不应重定向,而应跳转到最后的 render
调用,该调用会重新显示表单以及错误。