Как перенаправить на домашнюю страницу в 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'),
]

Таким образом, когда аутентифицированный пользователь попытается зайти на страницу входа в систему, он будет перенаправлен на главную страницу.

Вернуться на верх