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()