Как заставить пользовательский адаптер соблюдать параметр запроса 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 к моменту запуска вашего адаптера.

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