Как заставить пользовательский адаптер соблюдать параметр запроса URL "next"
Я использую allauth в своем проекте Django и настроил пользовательский адаптер учетной записи, который я указал в settings.py - ACCOUNT_ADAPTER. Моя проблема в том, что как только пользователь входит в систему по URL-адресу, например /accounts /login/?next=/checkout/, у моего пользовательского адаптера есть метод get_login_redirect_url, определенный для перенаправления пользователей в зависимости от их типа пользователя. Дело в том, что я бы хотел, чтобы этот адаптер соблюдал параметр URL next. Но когда я смотрю на значения - request.GET, request.POST, request.session, параметр next остается пустым.
Как этого добиться?
Причина, по которой поле next в request пусто.GET и request.POST, заключается в том, что Django Allauth не сохраняет его там во время процесса входа в систему. Вместо этого он сохраняет следующий URL-адрес в сеансе пользователя под ключом 'account_login_next'.
Итак, чтобы получить URL-адрес перенаправления внутри вашего пользовательского адаптера, вам просто нужно проверить request.session как
from allauth.account.adapter import DefaultAccountAdapter
from django.urls import reverse
class CustomAccountAdapter(DefaultAccountAdapter):
def get_login_redirect_url(self, request):
next_url = request.session.get('account_login_next', '')
if next_url:
# Optional: remove it so it doesn’t get reused accidentally
del request.session['account_login_next']
return next_url
if request.user.is_staff:
return reverse('dashboard')
return reverse('home')
По сути, Allauth извлекает следующий параметр из URL-адреса при первом посещении страницы входа в систему и помещает его в сеанс, чтобы его можно было использовать позже после входа в систему. Вот почему вы больше не видите его в GET или POST к моменту запуска вашего адаптера.