【发布时间】:2021-11-14 13:28:43
【问题描述】:
我是 Django 新手,我正在使用 Django 创建一个电子商务商店。我成功创建了完美运行的用户登录表单,但我被困在用户注册表单上。无效。
我的 forms.py:
from django import forms
from django.forms.widgets import PasswordInput
class UserLoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
class UserRegistrationForm(forms.Form):
username = forms.CharField()
email = forms.EmailField()
password = forms.CharField(widget=forms.PasswordInput)
password2 = forms.CharField(label='Confirm password', widget=forms.PasswordInput)
def clean(self):
cleaned_data = super().clean()
data = self.cleaned_data
password = cleaned_data.get('password')
password2 = cleaned_data.get('password2')
if password2 != password:
raise forms.ValidationError("Passwords must match")
return data
我的 register.html
<div>
<form method="POST" action="">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" name="Register">
</form>
</div>
我的 login.html
<div>
<form method="POST" action="">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" name="Login">
</form>
</div>
我的意见.py
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from .forms import UserLoginForm, UserRegistrationForm
# Create your views here.
def userRegistrationPage(request):
form = UserRegistrationForm()
context = {
'form': form
}
if request.method == 'POST':
form = UserRegistrationForm(request.POST or None)
if form.is_valid():
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
print(username, password)
else:
print("Form is not valid")
return render(request, 'index/register.html', context)
def userLoginPage(request):
form = UserLoginForm()
context = {
'form': form
}
if request.method == 'POST':
form = UserLoginForm(request.POST or None)
if form.is_valid():
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
user = authenticate(request, username=username, password=password)
print(user)
if user is not None:
login(request, user)
# Redirect to a success page.
return redirect("/")
else:
print("Error")
return render(request, 'index/login.html', context)
我的 urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name="index-page"), # Home Page
path('register', views.userRegistrationPage, name='register'), #User Registeration Page
path('login', views.userLoginPage, name='login'), #User Login Page
]
每次访问localhost:8000/register 时,我都会从views.py 中的表单验证的if/else 条件中收到消息Form is not valid。我对UserLoginForm 做了类似的处理,效果很好。
我尝试解决并查看了 Django 文档,但我没有发现问题所在。有人可以帮我为什么表格无效吗?我做错了什么?非常感谢。
【问题讨论】:
-
您填写表格然后在测试中提交吗?
-
是的,我填写了表格并按下了
Submit按钮,但没有执行if form.is_valid()条件下的语句 -
@YasamanShokri,如果我从
forms.py中删除clean(self)方法,那么UserRegistrationForm可以完美运行,if form.is_valid()条件的主体也会执行。 -
您的 clean() 函数似乎有问题。试试这个,看看它是否有效。 password=data.get('password) 和 password2=data.get('password2')
-
@YasamanShokri 我终于弄清楚
clean()方法和if form.is_valid()条件都在工作,只是raise forms.ValidationError("Passwords must match")没有以一种不会打印错误的方式工作提交不同的密码。当我使用不同的密码测试表单时,这就是我的表单无效的原因,因为它引发了错误。当我使用相同的密码对其进行测试时,它运行良好,但重点是我应该如何引发错误以便它在前端打印错误?
标签: python django django-forms