Как перенаправить на домашнюю страницу в Django, если вы уже вошли в систему, а затем пытаетесь получить доступ к /accounts/login/?
Итак, у меня есть "django.contrib.auth.urls" для реализации логина в моем приложении под названием accounts. Я также установил LOGIN_REDIRECT_URL = "home" LOGOUT_REDIRECT_URL = "home" в настройках.
Когда я вхожу в систему, она перенаправляет меня на главную страницу, как я установил в шаблоне ниже. Проблема в том, что когда я вхожу в систему, а затем пытаюсь перейти в /accounts/login/, он по-прежнему перенаправляет меня на страницу входа.
Я не смог понять, как сделать автоматическое перенаправление на домашнюю страницу, если пользователь аутентифицирован и пытается получить доступ к 'accounts/login/' или 'accounts/signup/.
Я думал, что это поведение включено в "django.contrib.auth.urls". Что я делаю не так?
Вот моя настройка project.urls:
from django.contrib import admin
from django.views.generic.base import TemplateView
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/', include('accounts.urls')),
path('accounts/', include('django.contrib.auth.urls')),
path('', TemplateView.as_view(template_name='home.html'), name='home'),
]
Вот мои accounts.urls:
from django.urls import path
from accounts.views import SignUpView, log_out
urlpatterns = [
path('signup/', SignUpView.as_view(), name='signup'),
path('logout/', log_out, name='logout'),
]
Вот мои взгляды:
from django.urls import reverse_lazy
from django.views.generic import CreateView
from django.contrib.auth import logout
from django.shortcuts import redirect
from accounts.forms import CustomUserCreationForm
class SignUpView(CreateView):
form_class = CustomUserCreationForm
success_url = reverse_lazy('login')
template_name = 'registration/signup.html'
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated:
return redirect('home')
return super().dispatch(request, *args, **kwargs)
def log_out(request):
logout(request)
return redirect('home')
А это код шаблона для home:
{% extends "base.html" %}
{% block title %}Home{% endblock title %}
{% block content %}
{% if user.is_authenticated %}
Hi {{ user.email }}!
<p><a href="{% url 'logout' %}">Log Out</a></p>
{% endif %}
{% if not user.is_authenticated %}
<p>You are not logged in</p>
<a href="{% url 'login' %}">Log In</a> |
<a href="{% url 'signup' %}">Sign Up</a>
{% endif %}
{% endblock content %}
Я использую Django версии 5 и Python 3.12, если это тоже поможет.
Может ли кто-нибудь заметить ошибку, которую я допускаю в коде или в своих предположениях?
То, что вы описываете, не включено в "django.contrib.auth.urls" по умолчанию. Представление входа, предоставляемое фреймворком аутентификации Django, не перенаправляет автоматически аутентифицированных пользователей на другую страницу, если они пытаются зайти на страницу входа.
Для этого можно переопределить представление входа в систему и добавить проверку, аутентифицирован ли пользователь. Если да, то можно перенаправить его на главную страницу.
Сначала создайте новое представление в файле accounts/views.py:
from django.shortcuts import redirect
from django.contrib.auth.views import LoginView
class CustomLoginView(LoginView):
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated:
return redirect('home')
return super().dispatch(request, *args, **kwargs)
В вашем аккаунте/urls.py замените путь для логина:
from accounts.views import SignUpView, log_out, CustomLoginView
urlpatterns = [
path('login/', CustomLoginView.as_view(), name='login'),
path('signup/', SignUpView.as_view(), name='signup'),
path('logout/', log_out, name='logout'),
]
Таким образом, когда аутентифицированный пользователь попытается зайти на страницу входа в систему, он будет перенаправлен на главную страницу.