You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django路由问题:无accounts/路由却跳转至accounts/login/引发404错误

解决Django登录后跳转到不存在的accounts/login/路由导致404的问题

看起来你遇到的问题是几个小细节没处理到位,我帮你梳理下原因和解决办法:

问题根源分析

  1. 错误的form_valid方法位置:你把登录后的重定向逻辑写在了LoginForm表单类里,但form_valid是FormView类视图的方法,不是表单的方法——这导致你的自定义登录逻辑根本没被执行,Django在某些场景下 fallback 到了默认的认证路由设置。
  2. 默认登录路由未覆盖:Django自带的login_required装饰器默认会把未登录用户重定向到/accounts/login/,但你项目里没配置这个路由,所以访问时直接触发404。

分步解决方案

1. 把form_valid移到LoginView中

先修正视图层的逻辑,把原本写在LoginForm里的form_valid方法移到LoginView类里,这才是它该待的地方:

修改forms.views里的LoginView:

from django.contrib.auth import login

class LoginView(FormView):
    form_class = LoginForm #instance
    template_name = 'forms/login.html'
    success_url = '/profile/'

    def form_valid(self, form):
        request = self.request
        next_ = request.GET.get('next')
        next_post = request.POST.get('next')
        redirect_path = next_ or next_post or None
        email = form.cleaned_data.get('email')
        password = form.cleaned_data.get('password')
        user = authenticate(username=email, password=password)
        if user is not None:
            login(request, user)
            try:
                del request.session['UserProfile.html']
            except KeyError:
                # 捕获KeyError避免删除不存在的session键报错
                pass
            if is_safe_url(redirect_path, request.get_host()):
                return redirect(redirect_path)
            else:
                # 重定向到预设的success_url,不要跳回login避免循环
                return redirect(self.success_url)
        return super().form_invalid(form)

然后删除LoginForm里的form_valid方法,表单只保留字段定义即可:

class LoginForm(forms.Form):
    email = forms.EmailField(label='email')
    password = forms.CharField(widget=forms.PasswordInput)

2. 在settings.py中覆盖默认登录路由

打开项目根目录的settings.py,添加一行配置,告诉Django你的自定义登录页面路径是/login/:

LOGIN_URL = '/login/'

这样当login_required装饰的视图检测到用户未登录时,会正确跳转到你配置的/login/?next=/profile/,而不是默认的/accounts/login/。

3. 确认profile视图的登录验证(可选)

如果你还没给profile视图加登录验证,记得加上@login_required装饰器,确保未登录用户不能直接访问:

# user_profile/views.py
from django.contrib.auth.decorators import login_required

@login_required
def profile(request):
    # 你的视图逻辑代码
    ...

测试验证

做完以上修改后,你可以测试两个场景:

  • 直接访问/login/,登录成功后应该直接跳转到/profile/
  • 未登录状态下访问/profile/,会被重定向到/login/?next=/profile/,登录完成后自动跳转到/profile/

这样就不会再出现/accounts/login/的404错误了。

内容的提问来源于stack exchange,提问作者arafat_ratul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:36:41