Search code examples
pythondjangoauthenticationruntime-errorframe

Why user.is_active is false if the username and password are stored in the database?


Every time I try to log in in the website I created, it returns the else in the user_login function in views.py, but I don't understand why since it stores correctly in Users in the database.

views.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',)

forms.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')

models.py

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

login.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 %}

So please, if someone see an error in my code please notify me, because I'm literally blocked with this problem.


Solution

  • authenticate methods takes in request as first argument.

    def user_login(request):
       
            if request.method == 'POST':
                username = request.POST.get('username')
                password = request.POST.get('password')
        
                # user = authenticate(username = username, password = password)
                user = authenticate(request, 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',)
    

    And as first answer suggests password (not password1) and password2 are not required args you only need password to set password how you validate it is upto you.

    Edit

    <form action="{% url 'app1:user_login' %}" method="POST">
    
    {% csrf_token %}
    <label for="username">Username:</label>
    <input type="text" name="username" id="username"placeholder = "enter username">
    
    <label for="password">Password:</label>
    <input type="password" name="password" id="password">
    <button type="submit">Submit</button>