我有多个视图函数,在我的 view.py 中有
@login_required
装饰器。当我注销并尝试访问其视图功能具有 @login_required
装饰器的页面之一时,我被重定向到具有这种 url 的页面。 http://localhost:8002/signin/?next=/pending/
。但是,当我登录时,我被重定向到索引页面而不是待定页面,我已经尝试使用 this question 和 this question 的解决方案来解决我的问题,但它不起作用。
这是我的登录视图函数
def signin(request):
if request.user.is_authenticated:
return redirect(index)
if request.method == "POST":
form = Signin(request.POST)
if form.is_valid():
username = request.POST.get("username")
password = request.POST.get("password")
user = User.objects.filter(username=username.lower()).exists()
if user:
get_user = User.objects.filter(username=username.lower())
check_pass = check_password(password, get_user[0].password)
if not check_pass:
messages.error(request, "Invalid Credentials")
return redirect(signin)
else:
login(request, get_user[0])
return redirect(index)
else:
messages.error(request, "Invalid Credentials")
return redirect(signin)
else:
form = Signin()
return render(request, "accounts/login.html", {"form": form})
这是我的 urls.py
from django.urls import path
from accounts import views
urlpatterns = [
path("signup/", views.signup, name="signup"),
path("signin/", views.signin, name="signin"),
path("signout/", views.signout, name="signout"),
这是我的登录模板
<!DOCTYPE html>
<html lang="en" class="supernova login-page">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SignIn</title>
<link rel="stylesheet" href="/static/signup/css/1.css">
<link rel="stylesheet" href="/static/signup/css/2.css">
<link rel="stylesheet" href="/static/signup/css/3.css">
<link rel="stylesheet" href="/static/signup/css/4.css">
<link rel="stylesheet" href="/static/signup/css/5.css">
<link rel="stylesheet" href="/static/signup/css/6.css">
<link rel="stylesheet" href="/static/signup/css/main.css">
<link rel="shortcut icon" href="/static/img/icons/favicon.ico" type="image/x-icon">
</head>
<body>
<form class="jotform-form" action="/signin/" method="post" enctype="multipart/form-data" name="form_230023299150548" id="230023299150548" accept-charset="utf-8" autocomplete="on">
{% csrf_token %}
<div role="main" class="form-all">
<ul class="form-section page-section main-page login-section">
<li id="cid_60" class="form-input-wide" data-type="control_head">
<div class="form-header-group header-small">
<div class="header-text httal htvam">
<h3 id="header_60" class="form-header" data-component="header">Login</h3>
</div>
</div>
</li>
<li class="form-line jf-required" data-type="control_textbox" id="id_64">
<label class="form-label form-label-left" id="label_64" for="input_64"> Username
<span class="form-required">*</span>
</label>
<div id="cid_64" class="form-input jf-required">
{{form.username}}
</div>
</li>
<li class="form-line jf-required" data-type="control_fullname" id="id_66">
<label class="form-label form-label-left form-label-auto" id="label_66" for="first_66">Password
<span class="form-required">*</span>
</label>
<div id="cid_66" class="form-input jf-required">
<div data-wrapper-react="true">
<span class="form-sub-label-container" style="vertical-align:top" data-input-type="first">
{{form.password}}
</span>
</div>
</li>
<input type="hidden" name="next" value="{{ next }}">
<li class="form-line" data-type="control_button" id="id_76">
<div id="cid_76" class="form-input-wide">
<div data-align="center" class="form-buttons-wrapper form-buttons-center jsTest-button-wrapperField"><button id="input_76" type="submit" class="form-submit-button submit-button jf-form-buttons jsTest-submitField" data-component="button" data-content="">Submit</button></div>
</div>
</li>
<div class="messages">
{% for message in messages %}
<p class="message">{{message}}</p>
{% endfor %}
</div>
</ul>
</div>
<div class="redirect">
<p class="redirect-p">
<a href="/signup/">Click here to register</a>
</p>
</div>
<!-- <div class="formFooter-heightMask"></div>
<div class="formFooter f6 branding21"></div> -->
</form>
<script src="/static/signup/js/1.js"></script>
<script src="/static/signup/js/2.js"></script>
<script src="/static/signup/js/3.js"></script>
<script src="/static/signup/js/4.js"></script>
<script src="/static/signup/js/5.js"></script>
<script src="/static/signup/js/6.js"></script>
</body>
</html>
那么我该怎么做才能将我重定向到下一页而不是索引页。
这不是您验证用户和重定向的正确方式。成功登录后,您已重定向到索引页面。要重定向到下一页,您可以尝试:
redirect_url = request.GET.get('next')
return redirect(redirect_url)
signin 视图应该是这样的: 从 django.contrib.auth 导入验证
def signin(request):
if request.user.is_authenticated:
return redirect(index)
if request.method == "POST":
form = Signin(request.POST)
if form.is_valid():
username = request.POST.get("username")
password = request.POST.get("password")
redirect_url = request.GET.get("next")
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
messages.success(request, "You have logged in!")
if redirect_url:
return redirect(redirect_url)
else:
return redirect('index')
else:
messages.warning(request, "Your account is disabled!")
else:
messages.error(request, "Invalid Credentials")
else:
form = Signin()
return render(request, "accounts/login.html", {"form": form})
或者你可以使用 Django 内置的 LoginView。在你的 urls.py 中导入 LoginView 并添加到这样的路径:
from django.contrib.auth.views import LoginView
urlpatterns = [
# Other urls
path('login/', LoginView.as_view(template_name='accounts/login.html'), name='signin'),
]
LoginView 的 Django 官方文档。 检查文件