Django - неудачный вход перенаправляет на другую страницу
Я новичок в Django и пытаюсь использовать систему аутентификации. Мне удалось заставить ее работать, используя стандартные Auth URLS. (/accounts/login) и т. д.
Я хочу вывести форму входа на домашнюю страницу, чтобы она всегда была доступна для неаутентифицированных пользователей. Мне удалось отобразить форму, и когда пользователь вводит правильные данные, вход проходит успешно. К сожалению, когда пользователь вводит неправильную информацию, он в настоящее время перенаправляет меня на url входа (accounts/login) Я пытался исправить это, но я либо нарушаю аутентификацию, либо она перенаправляет, и я не могу найти решение.
Views.py:
def index(request):
if request.method == 'POST':
form = AuthenticationForm(request.POST)
if form.is_valid():
form.save()
return redirect('/')
else:
form = AuthenticationForm()
return render(request, 'home.html', { 'form': form })
Шаблон HTML:
<form class="p-4 p-md-5 border rounded-3 bg-body-tertiary" action="{% url 'login' %}" method="post">
{% csrf_token %}
<div class="form-floating mb-3">
<input class="form-control" id="{{ form.username.id_for_label }}" name="username" type="text" />
<label for="{{ form.username.id_for_label }}">{{ form.username.label }}</label>
</div>
<div class="form-floating mb-3">
<input class="form-control" id="{{ form.password.id_for_label }}" name="password" type="password" />
<label for="{{ form.password.id_for_label }}">{{ form.password.label }}</label>
</div>
{% if form.errors %}
<div class="justify-content-center d-flex w-75 mt-1 mb-1 alert alert-danger border-0">
<small class="text-center mx-4">Your Username and Password Did Not Match!</small>
</div>
{% endif %}
<input class="w-100 btn btn-primary" type="submit" name="submit" value="Login"></input>
<a class="text-center pb-3 text-decoration-none" href="{% url 'register' %}"><small class="text-muted">Don't have an account?</small></a>
</form>
urls.py
path('', views.index, name="home"),
Я пробовал редактировать действие в форме, чтобы оно переводило меня в Home, или вообще удалять действие, однако это нарушает работу auth.
Проблема здесь в том, что AuthenticationForm не обрабатывает логику аутентификации для вас; это просто форма проверки. Вы должны использовать функции Django authenticate и login для обработки запросов на вход непосредственно в вашем представлении.
Обновлено views.py
from django.contrib.auth import authenticate, login
def index(request):
form = AuthenticationForm(data=request.POST or None)
if request.method == 'POST':
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('/') # Redirect to home after successful login
return render(request, 'home.html', {'form': form})