[英]Django Login Form Returning false on is_valid() if username already exists
我有一個從 Django 的User
模型創建的登錄表單:
形式.py :
class LoginForm(ModelForm):
class Meta:
model = User
fields = ['username', 'password']
widgets = {
'username': forms.TextInput(attrs={'placeholder': '@username'}),
'password': forms.PasswordInput(attrs={'placeholder': 'Password'})
}
視圖.py :
reg = LoginForm(request.POST or None)
if reg.is_valid():
return HttpResponse('Success: valid form')
else:
return HttpResponse('Error: invalid form')
現在,如果我嘗試使用未注冊的用戶名登錄,它會返回Success: valid form但如果它是一個已經存在的用戶名,它會顯示Error: invalid form 。
我嘗試在命令行中執行此操作,下面是我得到的結果(我首先使用 register yax用戶名嘗試了它):
In [2]: data = {'username':'yax', 'password':'wrong_password'}
In [3]: form = LoginForm(data)
In [4]: form.is_valid()
Out[5]: False
In [6]: form.errors
Out[7]: {'username': [u'A user with that username already exists.']}
In [8]: data = {'username':'wrong_name', 'password':'wrong_password'}
In [9]: form = LoginForm(data)
In [10]: form.is_valid()
Out[11]: True
In [12]: form.errors
Out[13]: {}
很高興我能知道為什么會出現此錯誤以及如何解決。
登錄表單不應是 ModelForm。 這是用於創建或編輯模型實例 - 在這種情況下,由於您不提供instance
參數,Django 假定您要創建一個新用戶。
只需使用標准表單並明確定義用戶名和密碼字段即可。
或者,使用 django.contrib.auth.forms 中提供的AuthenticationForm ,它會為您處理整個身份驗證/登錄過程。
登錄視圖功能的代碼(希望它會幫助某人):
from django.contrib.auth import authenticate, login as auth_login
from django.shortcuts import render, redirect
from .forms import LoginForm
def login(request):
if request.method == 'POST':
form = LoginForm(data=request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
auth_login(request, user)
return redirect('/')
form = LoginForm()
return render(request, 'login.html', {'form':form})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.