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.
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>