ikr*_*reb 2 python django redirect
如果用户已经通过身份验证,我想重定向到主页。所以我想从/重定向到/ main
views.py:
class LoginView(FormView):
form_class = LoginForm
success_url = reverse_lazy('main')
template_name = 'module/login.html'
def form_valid(self, form):
if self.request.user.is_authenticated():
return redirect(settings.LOGIN_REDIRECT_URL)
else:
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user = authenticate(username=username, password=password)
if user is not None and user.is_active:
login(self.request, user)
return super(LoginView, self).form_valid(form)
else:
return self.form_invalid(form)
Run Code Online (Sandbox Code Playgroud)
settings.py:
LOGIN_REDIRECT_URL = reverse_lazy('main')
LOGIN_URL = reverse_lazy('login')
LOGOUT_URL = reverse_lazy('logout')
Run Code Online (Sandbox Code Playgroud)
我也尝试添加一个get函数,但是随后它只能无限次数地调用自身。
def get(self, request, *args, **kwargs):
if request.user.is_authenticated():
return HttpResponseRedirect('main')
else:
return HttpResponseRedirect('/login/')
Run Code Online (Sandbox Code Playgroud)
urls.py:
url(r'^$', views.LoginView.as_view(), name='login'),
url(r'^login/', views.LoginView.as_view(), name='login'),
Run Code Online (Sandbox Code Playgroud)
您确实会在else部分中重定向到视图本身,因此会出现无限重定向循环。改为:
def get(self, request, *args, **kwargs):
if request.user.is_authenticated():
return HttpResponseRedirect('main')
return super(LoginView, self).get(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
您还应该在中将两个视图中的第一个重命名urls.py为'main'。
如果您的应用程序是 Django 2.x 或 3.x,那么这就是方法。
from django.contrib.auth import views as auth_views
from django.urls import path
urlpatterns = [
path('login/', auth_views.LoginView.as_view(redirect_authenticated_user=True), name='login'),
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
945 次 |
| 最近记录: |