Не удается перенаправить на следующую страницу после успешного входа в систему в Django
Несмотря на то, что я ввел правильные учетные данные, меня постоянно перенаправляют обратно на страницу входа в систему, вместо того чтобы предоставить доступ к странице Продуктов. Эта проблема сохраняется, даже если учетные данные действительны, что указывает на возможную проблему с процессом входа в систему и аутентификации. В результате я не могу перейти за пределы страницы входа в систему.
Views.py
Urls.py
from django.urls import path
from . import views
urlpatterns=[path("Home",views.Home),
path("SignUp",views.SignUp,name='signup'),
path("Products",views.Products,name="Products"),
path('Products/<slug:slug>',views.about_product,name="About Product"),
path("login",views.Login,name='login'),
path('logout',views.logout,name='logout')]
login.html
{% extends "base.html" %}
{% block title %}
Login
{% endblock %}
{% load static %}
{% block css_files %}
<link rel="stylesheet" href="{% static 'reviews/Login.css' %}">
{% endblock %}
{% block content %}
{% if next %}
<form action="{% url 'login' %}?next={{ next }}" method="POST" >
{%else%}
<form method="POST" action="{% url 'login' %}">
{% endif %}
{% csrf_token %}
<div class="input-section">
{% if form.non_field_errors %}
<div class="error-message">
{% for error in form.non_field_errors %}
<p>{{ error }}</p>
{% endfor %}
</div>
{% endif %}
<div class="input-group">
<label for="{{ form.username.id_for_label }}">Username</label>
{{ form.username }}
{% if form.username.errors %}
<div class="error-message">
{% for error in form.username.errors %}
<p>{{ error }}</p>
{% endfor %}
</div>
{% endif %}
</div>
<div class="input-group">
<label for="{{ form.password.id_for_label }}">Password</label>
{{ form.password }}
{% if form.password.errors %}
<div class="error-message">
{% for error in form.password.errors %}
<p>{{ error }}</p>
{% endfor %}
</div>
{% endif %}
</div>
<button class="submit-btn" type="submit">Login</button>
</div>
</form>
{% endblock %}
settings.py
Система аутентификации Djangos использует встроенную модель USER
, которая может быть импортирована из django.contrib.auth.models.User
. Но в вашей функции регистрации вы сохраняете учетные данные вручную в пользовательской модели UserRegister
без хэширования пароля. Ваша текущая функция сохраняет пароль в виде текста.
form_info = UserRegister(
username=form.cleaned_data.get('username'),
email=form.cleaned_data.get('email'),
password=form.cleaned_data.get('password1') # ❌ Password should be hashed
)
form_info.save()
Затем в вашей функции входа в систему вы используете authenticate()
, которая работает только в том случае, если пользователь существует в модели пользователя Django по умолчанию. Django's authenticate()
не распознает ваш пользовательский интерфейс UserRegister
.
Я бы посоветовал вам использовать встроенную пользовательскую модель, поскольку это правильно обработает аутентификацию.
from django.contrib.auth.models import User # Import Django's built-in User model
def SignUp(request):
if request.method == "POST":
form = UserRegisterForm(request.POST)
if form.is_valid():
user = User.objects.create_user(
username=form.cleaned_data.get('username'),
email=form.cleaned_data.get('email'),
password=form.cleaned_data.get('password1') # ✅ Password is now hashed
)
user.save()
messages.success(request, 'Your account has been created!')
return HttpResponseRedirect('/Products')
else:
print("Form is not valid")
print(form.errors)
else:
form = UserRegisterForm()
return render(request, 'SignUp.html', {'form': form})
Кроме того, для пользовательского UserRegister
расширьте встроенный в Django AbstractUser
from django.contrib.auth.models import AbstractUser
class UserRegister(AbstractUser):
pass # Use Django's built-in authentication fields