Я использую следующий процессор контекста для передачи контекста всем своим страницам, за исключением случаев, когда пользователь не вошел в систему, и в этом случае он переводит его на страницу входа:
from django.conf import settings
from .models import foo
from django.shortcuts import redirect
def globalVar(request):
if not request.session.get('user_id') is None:
return {"foo": foo}
else:
return redirect('login')
Но перенаправление вызывает исключение, для которого я не нашел исправления:ValueError: dictionary update sequence element #0 has length 0; 2 is required
Я ищу не в том месте или есть способ заменить перенаправление на что-то другое?
Вы не можете просто вернуть перенаправление из контекстного процессора, так как контекстные процессоры должны возвращать dict контекстных переменных.
Если вам действительно нужна эта функция в контекстном процессоре, вам нужно будет
(в стороне, я написал пакет, который делает это -django-safespace
)
Вместо этого, если можете, используйте login_required
декоратор (или миксин CBV - см. связанную документацию), чтобы сделать все ваше представление зарегистрированным только пользователем.
РЕДАКТИРОВАТЬ: в приведенном выше ответе предполагалось что-то еще, поэтому я удалил и заменил объяснением, почему возврат перенаправления не работает, если вы хотите понять
context = {}
redirect = redirect('login')
context.update(redirect)
Это должно вызвать ту же ошибку, что и вы. Есть идея?
...
на?
url
илиpath
Ahmed I. Elsayedname
в качестве позиционного аргумента в позицииcontext
, используйтеname='login'
в имеющемся urlpattern, и он должен работать нормально. Ahmed I. Elsayed'login'
на'name='login'
? S P H I N X U S