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

Django类视图中已登录用户访问注册页如何重定向至个人中心?

解决方案:实现已认证用户访问注册页自动重定向

方法一:直接重写dispatch方法(最简洁)

去掉UserPassesTestMixin,在Registration视图里重写dispatch方法,提前检查用户认证状态,已认证则直接跳转个人中心:

from django.shortcuts import redirect

class Registration(CreateView):
    form_class = RegistrationForm
    template_name = "registration/user_form.html"
    success_url = reverse_lazy("core:profile")

    def dispatch(self, request, *args, **kwargs):
        # 前置检查:已认证用户直接跳转
        if request.user.is_authenticated:
            return redirect(self.success_url)
        return super().dispatch(request, *args, **kwargs)

    def form_valid(self, form):
        self.object = form.save(commit=True)
        self.object.is_active = True
        self.object.save()

        login(self.request, self.object, backend="core.auth_backend.AuthBackend")
        return HttpResponseRedirect(self.success_url)

方法二:基于原有UserPassesTestMixin修改

如果你想保留UserPassesTestMixin,只需重写它的handle_no_permission方法,把默认的403响应改成重定向:

class Registration(UserPassesTestMixin, CreateView):
    form_class = RegistrationForm
    template_name = "registration/user_form.html"
    success_url = reverse_lazy("core:profile")

    def test_func(self):
        return self.request.user.is_anonymous

    def handle_no_permission(self):
        # 替换默认的403,返回重定向响应
        return redirect(self.success_url)

    def form_valid(self, form):
        self.object = form.save(commit=True)
        self.object.is_active = True
        self.object.save()

        login(self.request, self.object, backend="core.auth_backend.AuthBackend")
        return HttpResponseRedirect(self.success_url)

方法三:自定义可复用Mixin(适合多场景)

如果后续有其他视图需要相同逻辑,可以封装一个通用Mixin:

from django.shortcuts import redirect
from django.urls import reverse_lazy

class RedirectAuthenticatedUserMixin:
    # 默认跳转地址,可在视图中覆盖
    redirect_target = reverse_lazy("core:profile")

    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            return redirect(self.redirect_target)
        return super().dispatch(request, *args, **kwargs)

然后在注册视图中使用:

class Registration(RedirectAuthenticatedUserMixin, CreateView):
    form_class = RegistrationForm
    template_name = "registration/user_form.html"
    success_url = reverse_lazy("core:profile")
    # 可自定义跳转地址,不写则用Mixin默认值
    # redirect_target = reverse_lazy("core:dashboard")

    def form_valid(self, form):
        self.object = form.save(commit=True)
        self.object.is_active = True
        self.object.save()

        login(self.request, self.object, backend="core.auth_backend.AuthBackend")
        return HttpResponseRedirect(self.success_url)

内容的提问来源于stack exchange,提问作者Алексей Василенко

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:25:20