Django:重定向到调用登录的视图



我有一个非常常见的问题——登录后,我想重定向到调用登录的页面。我可以描述如下情况:Django:登录后重定向到上一页

有两个选项可以登录-从主页(在base.html中定义(和从bokeh.html(其他视图继承自bokeh(

mybase.htmlbokeh.html具有相同的重定向到登录的块。不同的是,从主页调用的登录应该返回主页,而从其他页面调用的登录则应该返回到调用的页面。

<li class="nav-item">
<a class="nav-link" href="{% url 'login' %}">Login</a>
</li>

mylogin.html

<form method="POST">
{% csrf_token %}
<div class="form-group">
<input type="text" class="form-control" placeholder="Enter Username" name="username" required>
</div>
<div class="form-group">
<input type="password" class="form-control" placeholder="Enter Password" name="password" required>
</div>
<div class="form-group">
<button type="submit" class="btn btn-dark">Login</button>
</div>
</form>

视图.py

def login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = auth.authenticate(username=username,password=password)
if user is not None:
auth.login(request,user)
return redirect('home')
else:
messages.info(request,'Invalid credentials')
return redirect('login')
else:
return render(request,'login.html')

我试图在login.html中添加到我的表单旁边,但没有成功。当从主页以外的页面访问登录时,它就像:localhost:8000/login?next=/bokeh/,在提交表格后,我仍然在登录,但URL变为localhost:8000/login?next=。我知道这很难解释,但我会补充其他需要的信息。

首先,将模板更改为包含登录url:的urlencodednext参数

<li class="nav-item">
<a class="nav-link" href="{% url 'login' %}?next={{ request.path |urlencode }}">Login</a>
</li>

其次,您的登录模板需要保留next:的值

<form method="POST">
<input type="hidden" name="next" value=""{{ next }}">
{% csrf_token %}
<div class="form-group">
<input type="text" class="form-control" placeholder="Enter Username" name="username" required>
</div>
<div class="form-group">
<input type="password" class="form-control" placeholder="Enter Password" name="password" required>
</div>
<div class="form-group">
<button type="submit" class="btn btn-dark">Login</button>
</div>
</form>

第三,您的登录视图应该检索URL参数并将其传递给模板:

from django.conf import settings
def login(request):
if request.method == 'GET':
next = request.GET.get('next', settings.LOGIN_REDIRECT_URL)
return render(request, 'login.html', {'next': next})
if request.method == 'POST':
next = request.POST['next']
username = request.POST['username']
password = request.POST['password']
user = auth.authenticate(username=username,password=password)
if user is not None:
auth.login(request,user)
return redirect(next)
else:
messages.info(request,'Invalid credentials')
return redirect('login')

最后,您应该考虑使用Django身份验证视图,而不是编写自己的登录视图!

最新更新