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,提问作者Алексей Василенко
相关产品推荐
相关产品推荐

