2009-07-07 4 views
1

У меня есть код, который получает текущий зарегистрированный пользователь.Сохранение Django Views DRY

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}) 

Это, кажется, идет против D.R.Y этики Джанго. Как я могу это сделать, повторяя себя?

EDIT: Возможно, Пользователь был плохим примером.

Что делать, если я хотел бы получить список объектов из базы данных,

items = Item.objects.all() 

и перечислить их на everypage.

Должен ли я написать этот код и передать список шаблону во всех представлениях. Или я могу написать код, который сделает этот список доступным для всех шаблонов?

ответ

1

Вы должны использовать custom template tag для чего-то подобного. Вы можете получить нужные данные в пользовательском теге и отправить его в шаблон. Все, что вам нужно запомнить, это загрузить тег в файл шаблона, в который вы собираетесь его использовать.

+0

, но тогда у вас есть {% load my _template_tag%} в 20 шаблонах ...это не DRY –

+3

Если вы используете его часто, скорее всего, это в родительском шаблоне, который вы расширяете, и, следовательно, вы будете иметь его только в одном месте. Если это не так, вы, вероятно, можете использовать настраиваемый контекстный процессор. –

3

Идентификатор пользователя уже существует в сеансе. Таким образом, вам не нужно проходить мимо.

{{ 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)) 
+0

Извините, я сделал опечатку Я хочу передать весь объект пользователя шаблону не только идентификатор –

+0

Опять же, весь пользователь уже существует, если вы добавили пользователя на сеанс, чтобы вы могли получить доступ к любому из его полей. – AlbertoPL

+1

@Cato: {{user}} доступен для любого шаблона, если вы поместите django.core.context_processors.auth в свои настройки. TEMPLATE_CONTEXT_PROCESSORS, но анонимные пользователи не являются ни одним, они являются экземплярами AnonymousUser. См. Http://docs.djangoproject.com/en/dev/topics/auth/#authentication-data-in-templates –

1

Как насчет request.user?

if request.user.is_authenticated(): 
    name = request.user.username 
else: 
    name = "Anonymous" 

Во всяком случае, если он уже не был доступен в Джанго, я предлагаю вам написать класс Middleware так же, как django.contrib.sessions.middleware.SessionMiddleware или django.contrib.auth.middleware.AuthenticationMiddleware , Этот класс изменяет детали запроса до их отправки в представление.

Если вам это нужно на основе представления, вы можете написать декоратор, чтобы сделать этот маленький бит, и @decorator, которые вы хотите.

Смежные вопросы