Пользователь доступен в представлениях, но не в шаблоне
Я пытаюсь использовать {% if user.is_authenticated %} в шаблоне, но пользователь фактически не существует. Если я пытаюсь вывести {{ user }}, то ничего нет.
В настройках у меня есть такие опции для ТЕМПЛАТОВ:
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
Я разработал класс бэкенда аутентификации для использования учетных данных активного каталога и добавил класс в AUTHENTICATION_BACKENDS в settings.py.
class CustomAuthenticationBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
"""
Authenticate user from active directory
If user is not found, create it
"""
# Get user from database
try:
user = User.objects.get(username=username)
# If user does not exist, create it
except User.DoesNotExist:
user = User(username=username)
user.displayed_name = kwargs['display_name']
user.email = kwargs['email']
user.save()
return user
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
Я добавил логику аутентификации и логику входа в django Form:
def authenticate_and_login(self, request) -> bool:
"""
Method to authenticate the user and login
return True if user is authenticated and logged in
or False and fill the form with errors
"""
is_logged = False
# Init active directory service
ad_service = ActiveDirectoryService()
# Get username and password
username = self.cleaned_data['username']
password = self.cleaned_data['password']
# Get authorized user from active directory
user = None
try:
user = ad_service.get_authorized_user(username, password)
except:
self.add_error(None, "Invalid credentials")
return is_logged
# Case user is authorized
if user is not None:
# Authenticate user and login
user = auth.authenticate(request=request, username=username, display_name=user['display_name'], email=user['email'])
request.user = user
auth.login(request, user)
is_logged = True
# Case user is not authorized
else:
self.add_error(None, "Unauthorized user")
return is_logged
После входа в систему я выполняю этот код в классе представления:
print("User is authenticated: {}".format(request.user.is_authenticated))
, который выводит то, что ожидается: "Пользователь аутентифицирован: True". Когда я пытаюсь использовать {{ user }} или {% if user.is_authenticated %} ничего не происходит, так как кажется, что переменная user не инициализирована в шаблоне.
Мое представление наследуется от родительского представления, которое наследуется от класса django View. В этом базовом классе я просто добавляю navbarviewmodel к контексту:
class BaseView(View):
"""
Base class for all views in app
"""
def __init__(self):
super(BaseView, self).__init__()
self.context = {}
def get(self, request, *args, **kwargs):
# Set navbar
self.context['navbar_vm'] = NavbarViewModel(
...
)
Кто-нибудь видит, каких компонентов мне не хватает, или что я неправильно настроил, что нарушило настройку пользователя в шаблонах django?
В моем проекте для добавления пользователя в контекст я создал mixin, используемый в большинстве моих представлений, основанных на классах:
from django.views.generic.base import ContextMixin
class UserInContext(ContextMixin):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['user'] = self.request.user
return context
вы можете использовать его следующим образом:
class BaseView(View, UserInContext):
def get(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs)
[...]