簡體   English   中英

如果用戶名已經存在,Django 登錄表單在 is_valid() 上返回 false

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM