所以我有“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.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'),
]
这样,当经过身份验证的用户尝试访问登录页面时,他们将被重定向到主页。