如果已经登录,如何重定向到 Django 主页,然后尝试访问 /accounts/login/?

问题描述 投票:0回答:1

所以我有“django.contrib.auth.urls”来在我的应用程序中实现登录,称为帐户。我还设置了 LOGIN_REDIRECT_URL = "home" LOGOUT_REDIRECT_URL = "主页" 在设置中。

当我登录时,它会将我重定向到主页,因为我已在下面的模板中进行了设置。问题是当我登录并尝试转到 /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'),
]

这是我的帐户.url:

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')

这是主页的模板代码:

{% 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 django-views django-templates django-urls django-authentication
1个回答
0
投票

默认情况下,您所描述的内容不包含在“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)

在你的accounts/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'),
]

这样,当经过身份验证的用户尝试访问登录页面时,他们将被重定向到主页。

© www.soinside.com 2019 - 2024. All rights reserved.