Django:如何在手动登录重定向旁边添加?
Django: How to add next to manual login redirect?
我有一个看法:
def create_something(request):
...
如果有人没有登录,我想重定向到登录。通常我会使用:
@login_required
def create_something(request):
...
但是...
我想在重定向之前添加一条消息。
我想这样做:
def create_something(request):
if not request.user.is_authenticated:
messages.info(request, 'You must be logged in to create a thing .')
return redirect('login')
...
但是,url 中不包含 ?next
以返回我要访问的页面。
所以我的问题是:
您如何使用手动添加的 ?next
查询手动重定向回登录页面?
只需将以下装饰器添加到您的函数中:
@login_required(login_url='/console/login')
'console/login' 是您要重定向到的 url 路径。或者,您可以将 url 添加到 settings.py 文件。
LOGIN_URL = 'url'
我们可以查看 source code [GitHub] of the @user_passes_test
decorator [Django-doc] 并确定这种重定向是如何完成的。
在源码中我们看到:
# ⋮
path = request.get_full_path()
from django.contrib.auth.views import <strong>redirect_to_login</strong>
return <strong>redirect_to_login(</strong>path, resolved_login_url, redirect_field_name<strong>)</strong>
因此,我们可以通过以下方式模仿这种行为:
from django.contrib.auth import <strong>REDIRECT_FIELD_NAME</strong>
from django.contrib.auth.views import <strong>redirect_to_login</strong>
from django.urls import reverse
def create_something(request):
if not request.user.is_authenticated:
messages.info(request, 'You must be logged in to create a thing �.')
<strong>path = request.get_full_path()</strong>
return <strong>redirect_to_login(path, reverse('login'))</strong>
# …
这里 .redirect_to_login(…)
function [Django-doc] 将因此产生一个重定向,其中查询字符串将包含一个键 next=…
,其中 next
与路径关联。
如果模式或主机名,您应该使用 path = request.build_absolute_uri()
。
我有一个看法:
def create_something(request):
...
如果有人没有登录,我想重定向到登录。通常我会使用:
@login_required
def create_something(request):
...
但是... 我想在重定向之前添加一条消息。
我想这样做:
def create_something(request):
if not request.user.is_authenticated:
messages.info(request, 'You must be logged in to create a thing .')
return redirect('login')
...
但是,url 中不包含 ?next
以返回我要访问的页面。
所以我的问题是:
您如何使用手动添加的 ?next
查询手动重定向回登录页面?
只需将以下装饰器添加到您的函数中:
@login_required(login_url='/console/login')
'console/login' 是您要重定向到的 url 路径。或者,您可以将 url 添加到 settings.py 文件。
LOGIN_URL = 'url'
我们可以查看 source code [GitHub] of the @user_passes_test
decorator [Django-doc] 并确定这种重定向是如何完成的。
在源码中我们看到:
# ⋮ path = request.get_full_path() from django.contrib.auth.views import <strong>redirect_to_login</strong> return <strong>redirect_to_login(</strong>path, resolved_login_url, redirect_field_name<strong>)</strong>
因此,我们可以通过以下方式模仿这种行为:
from django.contrib.auth import <strong>REDIRECT_FIELD_NAME</strong>
from django.contrib.auth.views import <strong>redirect_to_login</strong>
from django.urls import reverse
def create_something(request):
if not request.user.is_authenticated:
messages.info(request, 'You must be logged in to create a thing �.')
<strong>path = request.get_full_path()</strong>
return <strong>redirect_to_login(path, reverse('login'))</strong>
# …
这里 .redirect_to_login(…)
function [Django-doc] 将因此产生一个重定向,其中查询字符串将包含一个键 next=…
,其中 next
与路径关联。
如果模式或主机名,您应该使用 path = request.build_absolute_uri()
。