Django自定义登录视图下LOGIN_REDIRECT_URL不生效问题求助
问题分析与解决方案
你遇到的核心问题是搞混了LOGIN_URL和LOGIN_REDIRECT_URL的作用,而且@login_required装饰器默认会使用Django自带的登录路径/accounts/login/,你并没有明确指定自己的自定义登录视图路径,才导致了这个异常跳转。
问题原因拆解
LOGIN_REDIRECT_URL的作用是登录成功后默认跳转的页面,但你把它设置成了登录页面的路径,完全搞反了它的用途。@login_required装饰器在检测到用户未登录时,会自动跳转到LOGIN_URL配置的地址(默认值是/accounts/login/),但你根本没配置这个参数,所以才会出现系统默认的跳转路径。
解决方案步骤
1. 修正settings.py中的配置
把两个参数的作用理清楚,修改为正确的值:
# 指定自定义登录视图的URL,和你的应用urls.py里的name对应 LOGIN_URL = 'pilot:login' # 直接写'/login/'也可以生效 # 指定登录成功后默认跳转的页面(比如你的首页) LOGIN_REDIRECT_URL = 'pilot:home' # 或者写'/home/'
2. 优化登录视图的逻辑(可选但推荐)
你的登录视图目前是硬编码跳转到home页面,没有处理@login_required传递的next参数(就是URL里的?next=/home/部分)。可以修改为动态跳转,让用户登录后回到原本想要访问的页面,同时增加认证失败的判断避免报错:
from django.conf import settings from django.shortcuts import redirect def todologin(request): if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') user = authenticate(username=username, password=password) # 增加认证成功的判断,避免None值报错 if user is not None: login(request, user) # 获取next参数,没有则使用默认的LOGIN_REDIRECT_URL next_url = request.GET.get('next', settings.LOGIN_REDIRECT_URL) return redirect(next_url) else: form = LoginForm() return render(request, 'login.html', {'form':form})
3. 确认URL配置的正确性
检查项目根目录的urls.py,确保已经正确包含了你的应用URL,并且设置了命名空间(如果你用了pilot:xxx的命名方式):
from django.conf.urls import include, url urlpatterns = [ # 其他项目路径... url(r'^pilot/', include('pilot.urls', namespace='pilot')), ]
如果没有设置命名空间,那你的reverse调用应该写成reverse('home')而不是reverse('pilot:home'),对应的LOGIN_URL也要改成'login'。
完成以上修改后,当用户未登录访问/home/时,会被@login_required跳转到你的自定义登录页面/login/?next=/home/,登录成功后会自动跳转到用户原本想要访问的/home/页面,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Luv33preet
相关产品推荐
相关产品推荐

