Django: Как добавить следующее к ручному перенаправлению входа в систему?

У меня есть мнение:

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')
    ...

Однако, это не включает ?next в url, чтобы вернуться на страницу, на которую я переходил.

Итак, мой вопрос таков:

Как вручную перенаправить обратно на страницу входа в систему С добавленным вручную запросом ?next?

Просто добавьте приведенный ниже декоратор к вашей функции:

 @login_required(login_url='/console/login')

'console/login' - это путь url, на который вы хотите перенаправить. В качестве альтернативы вы можете добавить url в файл settings.py.

 LOGIN_URL = 'url'

Мы можем посмотреть исходный код [GitHub] декоратора @user_passes_test [Django-doc] и определить, как делается такой редирект.

В исходном коде мы видим:

# ⋮
path = request.get_full_path()
from django.contrib.auth.views import redirect_to_login
return redirect_to_login(path, resolved_login_url, redirect_field_name)

Таким образом, мы можем имитировать это поведение с помощью:

from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.auth.views import redirect_to_login
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 �.')
        path = request.get_full_path()
        return redirect_to_login(path, reverse('login'))
    # …

Здесь .redirect_to_login(…) функция [Django-doc] будет производить перенаправление, где строка запроса будет содержать ключ next=…, где next связан с путем.

Вы должны использовать path = request.build_absolute_uri() в случае схемы или имени хоста.

Вернуться на верх