form.is_valid 为 False,但 form.error 不是



我想提交登录信息。这是我的登录视图:

def login(request):
context = {}
print("ok ok ok ok ok")
user = request.user
if user.is_authenticated:
print("ok ici")
return render(request, "login.html")
form = LoginForm(request.POST or None)
if request.POST:
print("ok ici1")
if form.is_valid():
email = form.POST['email']
password = form.POST['password']
user = authenticate(request, email=email, password=password)
print(email)
if user:
login(request, user)
if user.user_type == '1':
return render(request, "administrateur.html")
elif user.user_type == '2':
return render(request, "entrepreneur.html")

elif form.errors:
print("errors")
print(form.errors)
form = AuthenticationForm()
context['login_form'] = form
return render(request, "login.html", context)

以及我在form.py中自定义用户的表单类

class LoginForm(forms.ModelForm):
class Meta:
model=CustomUser
fields ={'email','password'}

我的 HTML 是这样的

<form  method="POST" action="{% url 'businessplan:login' %}">
{% csrf_token %}
<h2> Vous ètes un Admin ?</h2>
<div class="container" action >
<input type="hidden"  name="user_type" value="1">
<label for ="id_email"><b>Votre Email</b></label>
<input id="id_email" type="text" placeholder="Entrer Votre Email" name="email" required>
<label for ="id_password" ><b>Mot de Passe</b></label>
<input id="id_password" type="password" placeholder="Entrer Votre Mot de passe" name="password" required>
<button type="submit" >Login</button>
<label>
<input type="checkbox" checked="checked" name="remember"> souviens de moi
</label>
</div>
<div class="container" style="background-color:#f1f1f1">
<button type="button" class="cancelbtn">annuler</button>
<span class="psw">oublier <a href="#">mot de passe?</a></span>
</div>
</form>

当我提交form.is_valid申报表时,错误和form.errors打印(<ul class="errorlist"><li>email<ul class="errorlist"><li>User with this Email already exists.</li></ul></li></ul>)

你能告诉我问题出在哪里吗?

它验证了email的唯一性约束,因此说它不能使用该用户名创建CustomUser

你可以做一个简单的Form,或者简单地使用AuthenticationForm[Django-doc]。例如,我们可以更改 [GitHub]AuthenticationForm的源代码:

class LoginForm(forms.Form):
"""
Base class for authenticating users. Extend this to get a form that accepts
username/password logins.
"""
email = forms.EmailField(widget=forms.TextInput(attrs={'autofocus': True}))
password = forms.CharField(
label=_("Password"),
strip=False,
widget=forms.PasswordInput(attrs={'autocomplete': 'current-password'}),
)

在视图中,我们可以使用表单的清理数据:

from django.shortcuts import redirect
def login(request):
if user.is_authenticated:
return redirect('name-of-some-view')
if request.method == 'POST':
form = AuthenticationForm(request.POST)
if form.is_valid():
email = form.cleaned_data['email']
password = form.cleaned_data['password']
user = authenticate(request, email=email, password=password)
if user is not None:
login(request, user)
if user.user_type == '1':
return redirect('name-of-some-view')
else:
return redirect('name-of-some-view')
else:
form = LoginForm()
return render(request, 'login.html', {'login_form': form})

注意:如果 POST 请求成功,您应该redirect[Django-doc] 实现发布/重定向/获取模式 [wiki]。 这样可以避免在用户刷新 浏览器。

相关内容

最新更新