Сохранение просмотров Django СУХИМИ
-
11-09-2019 - |
Вопрос
У меня есть некоторый код, который возвращает текущего вошедшего в систему пользователя.
userID = request.session.get("_auth_user_id")
if userID:
loggedin_user = User.objects.get(pk=int(userID))
else:
loggedin_user = None
Я хочу, чтобы имя пользователя отображалось на каждой странице.
На данный момент я помещаю код в каждое представление и передаю пользовательский объект в каждый шаблон
return render_to_response('index.html', {loggedin_user})
Похоже, это противоречит этике django D.R.Y.Как я могу сделать это, повторяясь?
Редактировать:Возможно, пользователь был плохим примером.
Что, если бы я хотел получить список объектов из базы данных,
items = Item.objects.all()
и перечислите их на каждой странице.
Должен ли я написать этот код и передавать список шаблону в каждом представлении?Или я могу один раз написать какой-нибудь код, который сделает этот список доступным для всех шаблонов?
Решение
Вы должны использовать пользовательский тег шаблона для чего-то подобного.Вы можете извлечь нужные вам данные из пользовательского тега и отправить их в шаблон.Все, что вам нужно запомнить, это загрузить тег в файл шаблона, в котором вы собираетесь его использовать.
Другие советы
Идентификатор пользователя уже существует в сеансе.Таким образом, вам не нужно постоянно передавать его по кругу.
{{ request.session._auth_user_id }}
Это должно сработать, но вам нужно добавить это в ваш TEMPLATE_CONTEXT_PROCESSORS в вашем файле настроек:
django.core.context_processors.request
В вашем render_to_response вам нужно будет добавить запрос в качестве параметра.Например:
return render_to_response('test.html',{}, context_instance=RequestContext(request))
Как насчет request.user?
if request.user.is_authenticated():
name = request.user.username
else:
name = "Anonymous"
В любом случае, если бы это еще не было доступно в django, я бы посоветовал вам написать класс промежуточного программного обеспечения, подобный django.contrib.sessions.middleware.Программное обеспечение SessionMiddleware или django.contrib.auth.промежуточное программное обеспечение.Программное обеспечение для аутентификации.Этот класс изменяет сведения о запросе до того, как они будут отправлены в представление.
Если вам это нужно для каждого просмотра, вы могли бы написать декоратор для выполнения этой небольшой части, а @decorator - для просмотра, который вы хотите.