簡體   English   中英

Django自定義登錄-表單有效,但沒有錯誤

[英]Django Custom Login - Form is valid but no error

我目前正在嘗試弄清楚如何自定義基本的Django用戶登錄功能以添加例如簡單驗證碼。

我從django.contrib.auth.formsAuthenticationForm ”,它看起來很棒,但是如果我嘗試登錄,我簡直無法。

我已經調試了代碼,目前只能得到:

響應= 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.

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