首页 > 解决方案 > 如果用户名和密码存储在数据库中,为什么 user.is_active 为 false?

问题描述

每次我尝试登录我创建的网站时,它都会在views.py的user_login函数中返回else,但我不明白为什么,因为它正确存储在数据库中的Users中。

视图.py

from django.shortcuts import render
from django.contrib.auth import authenticate, login, logout
from django.urls import reverse
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect, HttpResponse
from django.contrib.auth.models import User
from .forms import UserForm



# Create your views here.
def index(request):
    return render(request, 'app1/index.html')

@login_required
def user_logout(request):
    logout(request)
    return HttpResponseRedirect(reverse('index'))

def register(request):
    registered = False
    if request.method == 'POST':
        user_form = UserForm(data=request.POST)
        if user_form.is_valid():
            
            user = user_form.save()
            user.set_password(user.password)
            user.save()
            
            registered = True
        else:
            print(user_form.errors)
    else:
        user_form = UserForm()

    return render(request, 'app1/register.html',{'user_form':user_form, 'registered':registered})

def user_login(request):

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        user = authenticate(username = username, password = password)

        if user:
            if user.is_active:
                login(request, user)
                return HttpResponseRedirect(reverse('index'))
            else:
                return HttpResponse("Account Not Active")
        else:
            print("Someone tried to login and failed")
            print(f"Username: {username} and password {password}")
            return HttpResponse ("Invalid Login details supplied")
    
    else:
        return render(request, 'app1/login.html',)

表格.py

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm


class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())

    class Meta():
        model = User
        fields = ('username','email', 'password')

模型.py

from django.db import models
from django.contrib.auth.models import User

登录.html

{% extends 'app1/base.html' %}
{% block body_block %}

<div class="jumbotron">
    <h1>Please Login</h1>
    <form action="{% url 'app1:user_login' %}" method="POST">

        {% csrf_token %}
        <label for="username">Username:</label>
        <input type="text" name = "usuario" placeholder = "enter username">

        <label for="password">Password:</label>
        <input type="password" name="contra">

        <input type="submit" value="Login">
        
        


    </form>
</div>




{% endblock %}

所以,如果有人在我的代码中看到错误,请通知我,因为我确实被这个问题阻止了。

标签: pythondjangoauthenticationruntime-errorframe

解决方案


问题似乎是您缺少必填字段。必填字段为:用户名、密码 1 和密码 2。您需要两个密码字段才能对其进行验证(即检查两个字段是否填写了相同的密码)。

以下是相关文档:https ://docs.djangoproject.com/en/3.0/topics/auth/default/


推荐阅读