[英]Django Custom Login - Form is valid but no error
我目前正在嘗試弄清楚如何自定義基本的Django用戶登錄功能以添加例如簡單驗證碼。
我從django.contrib.auth.forms
“ AuthenticationForm
”,它看起來很棒,但是如果我嘗試登錄,我簡直無法。
我已經調試了代碼,目前只能得到:
響應= wraped_callback(request,* callback_args,** callback_kwargs)TypeError: init ()接受1個位置參數,但給出了2個
accounts/views.py
:
...
django.contrib.auth.forms的登錄表單子類化(復制到了accounts / forms.py):
...
urls.py
:
...
這里有些錯誤。
最主要的是,您已經覆蓋了類的init簽名,因此第一個位置參數是request
,但是您在該位置傳遞了POST數據; 因此,該表格將永遠不會受到約束並且永遠不會有效。
其次,如果表單無效,則由於某種原因需要重新實例化它,因此模板將永遠不會顯示任何驗證錯誤。 除非您有充分的理由,否則您應該堅持使用文檔中顯示的標准表單處理結構。
將它們放在一起:
def login (request):
if request.method == 'POST':
form = LoginForm(request, data=request.POST)
if form.is_valid():
form.save()
messages.add_message(request, messages.INFO, "You are now logged-In, welcome")
return redirect(reverse('post_list'))
else:
form = LoginForm(request)
args = {'form': form}
return render(request, 'registration/login.html', args)
注意,您不需要第二個else
塊; 此處的單個與第一個if
對齊,並且在兩種情況下都達到了最終return
。
正如Daniel所說,您更新了表單的init方法。 因此您必須將請求作為第一個參數傳遞。
其次是當您驗證用戶信息時,您必須使用身份驗證后端對用戶進行身份驗證。 但是您保存了表單數據。
如果您只想更改身份驗證表單,則可以使用這樣的登錄視圖
見下文:urls.py
....
url(r'^accounts/login/$', auth.login, {'authentication_form': LoginForm}, name='login'),
....
如果使用django2及更高版本,則可以像這樣更改它。 首先,創建一個從django.contrib.auth.views.LoginView擴展的基於類的視圖,在該類中將form_class這樣設置。
from django.conrtib.auth.views import LoginView
...
class NewLoginView(LoginView):
form_class = LoginForm
那么您必須像這樣更新您的網址:
...
url(r'^accounts/login/$', NewLoginView.as_view, name='login'),
...
您必須從django.contrib.auth.forms.AuthenticationForm
擴展表單,或者必須實現此表單類的所有必需功能。
我終於找到了解決方法,puuh:D
views.py:
...
from django.contrib.auth import update_session_auth_hash, authenticate, login as customlogin
...
def login(request):
if request.method == 'POST':
form = LoginForm(request.POST, request.POST)
if form.is_valid():
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
customlogin(request, user)
# Redirect to a success page.
return redirect(reverse('post_list'))
return render(request, 'registration/login.html', {'form': form})
else:
return render(request, 'registration/login.html', {'form': LoginForm()})
只需擴展表格(感謝vorujack)
...
from django.contrib.auth.forms import AuthenticationForm
...
class LoginForm (AuthenticationForm):
captcha = CaptchaField()
urls.py:
url(r'^accounts/login/$', views_accounts.login, name='login'),
真正愚蠢的部分是登錄功能“ form = LoginForm(request.POST,request.POST)”。您確實需要將其傳遞給密碼和用戶,並在旁邊和輔助request.POST傳遞驗證碼形式... Oookay 。 無論如何,現在它可以工作了。
感謝任何人的幫助,我非常感謝這個社區
當我使用vorujack的方式犯錯誤時,終於找到了解決方案
在網址中
from django.contrib.auth import views as auth_views
path('login/',auth_views.LoginView.as_view(form_class=forms.new_login_form,
template_name='login.html'), name='login'),
形式
from django.contrib.auth.forms import AuthenticationForm
class new_login_form(AuthenticationForm):
captcha = CaptchaField(label='驗證碼', error_messages={"invalid": "驗證碼錯誤"})
class Meta:
model = User
fields = ('username', 'password',)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.