django:登录表单无效

时间:2018-12-07 04:53:36

标签: django

我试图定义一个登录函数来登录我的用户,但是当单击按钮“ Ingresar”(西班牙语登录)时,什么都没有发生。

我尝试调试此错误,并且在函数def signinView(request):中,我注意到Django从未达到条件if form.is_valid():,因此显然我的表单无效。我不知道为什么?

*它从不打印“ Hola3”,仅打印“ Hola”和“ Hola2”。

views.py

from django.shortcuts import render, get_object_or_404, redirect
from django.http import HttpResponse
from .models import Category, Product
from django.contrib.auth.models import Group, User
from .forms import SignUpForm
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login, authenticate, logout


def signinView(request):
    print("Hola")
    if request.method == 'POST':
        print("Hola2")
        form = AuthenticationForm(request.POST)
        if form.is_valid():
            print("Hola3")
            username = request.POST['username']
            password = request.POST['password']
            print(username)
            print(password)
            user = authenticate(username = username,
                                password = password)
            if user is not None:
                login(request, user)
                return redirect('shop:allProdCat')
            else:
                return redirect('signup')

    else:
        form = AuthenticationForm()
    return render(request, 'accounts/signin.html', {'form':form})

html

<div class="col-12 col-sm-12 col-md-12 col-lg-6 bg-light">
                <div>
                    <br>
                    <h2 class="my_title">
                        Solo usuarios registrados
                    </h2>
                    <form method="post">
                        {% csrf_token %}
                        <p>{{ form | crispy }}</p>
                        <button type='submit' class="btn btn-secondary">Ingresar</button>
                    </form>
                    <br>
                </div>

            </div>

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index, name = 'index'),
    path('shop/', include('shop.urls')),
    path('cart/', include('cart.urls')),
    path('order/', include('order.urls')),
    path('account/create/', views.signupView, name = 'signup'),
    path('account/login/', views.signinView, name = 'signin'),
    path('account/logout/', views.signoutView, name = 'signout')
]

4 个答案:

答案 0 :(得分:1)

在您看来将此行变成

form = AuthenticationForm(request.POST)

form = AuthenticationForm(data=request.POST)

答案 1 :(得分:1)

Omar,为什么不只使用内置的身份验证视图而不是编写自己的身份验证视图?

from django.contrib.auth import views as auth_views

urlpatterns = [
               path('account/login/', auth_views.login, name = 'login'),

]

#settings
LOGIN_REDIRECT_URL = 'url to redirect user to after successful authentication'

然后,您只需要模板,便已准备就绪。这样可以使事情变得简单。

答案 2 :(得分:0)

我认为您应该从表单的request.POST中获取它,而不是通过cleaned_data进行访问:

def signinView(request):
    if request.method == 'POST':
        form = AuthenticationForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            user = authenticate(username = username,
                                password = password)
            if user is not None:
                login(request, user)
                return redirect('shop:allProdCat')
            else:
                return redirect('signup')

还要确保用户是否为active或已通过系统管理员站点正确注册。另外,请确保您使用的是custom backend而不是 modelbackend ,那么用于身份验证的参数可能会有所不同。

答案 3 :(得分:-1)

更改

return redirect('signup')

收件人

import django.urls import reverse
return redirect(reverse(‘signup'))

所有这些类型的重定向功能都将转换为此功能

相关问题