Вопрос

У меня есть некоторый код, который возвращает текущего вошедшего в систему пользователя.

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 - для просмотра, который вы хотите.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top