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()
в случае схемы или имени хоста.