2010-07-11 2 views
17

У меня есть общие данные (номер сообщения пользователя вошедшего в систему) для отображения на каждой странице. Я могу просто перейти к шаблону какКак передать общие словарные данные на каждую страницу в django

dict={'messagenumber':5} 
return render_to_response('template.html',dict,context_instance=RequestContext(request)) 

Но это выглядит утомительно, если у меня эти данные диктофона проходят на очень страницу. Есть ли более простой способ передачи общих данных на каждую страницу?

Thanks

ответ

16

Это сбивает меня с пути, насколько это распространено. Вы хотите использовать context processors мой друг!

Очень легко создавать, например, так:

def messagenumber_processor(request): 
    return {'messagenumber': 5} 

Поскольку messagenumber является динамической переменной на основе пользователя, можно извлекать данные из базы данных по выборке из request.user, как у вас есть полный доступ к request внутри каждого контекстный процессор.

Затем добавьте это в свой TEMPLATE_CONTEXT_PROCESSORS в настройках settings.py, и вы все настроены :-) Вы также можете использовать любую форму операции с базой данных или другую логику в контекстном процессоре, попробуйте!

+1

Два примечания: 1) Вы должны будете иметь django.contrib.auth.middleware.AuthenticationMiddleware в вашем MIDDLEWARE_CLASSES устанавливающего для того, чтобы request.user работать. 2) Только шаблоны, обработанные с помощью django.template.RequestContext-экземпляров в контексте, будут иметь обработчики контекста. –

+0

спасибо, еще пару вопросов. *) Я могу поместить этот метод в любом месте (в любых моих файлах просмотра)? *) Добавление этого процессора, как 'myproject.myapp.myview.messagenumber_processor'? и *) Как назвать эти данные в шаблоне? request.messagenumber_processor? – icn

+0

@Joseph Действительные баллы, которые указаны в ссылках, которые я разместил, но спасибо! @xlione Технически вы можете добавить его в свой проект, но его рекомендуется поместить в 'context_processors.py' для приложения, с которым будут работать эти процессоры контекста. Чтобы вызвать данные в вашем шаблоне, обратитесь к dict, который вы возвращаете в процессор контекста. Например, в моем примере, если я поместил '{{messagenumber}}' в свой шаблон, он выдаст '5', полагая, что я правильно подключил свой контекстный процессор. – Bartek

0

Напишите ваш собственный отзыв.

def render_with_message_number(template, message_number, request): 
    return render_to_response(template, dict(messagenumber=message_number), 
     context_instance=RequestContext(request)) 

И не тень dict.

17

Просто, чтобы спасти чью-то время, если новый Джанго

settings.py

TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth", 
"django.core.context_processors.debug", 
"django.core.context_processors.i18n", 
"django.core.context_processors.media", 
"django.core.context_processors.static", 
"django.contrib.messages.context_processors.messages", 
"home.context_processor.remote_ip") 

в домашнем применении, создайте файл с именем питона context_processor.py

в context_processor.py добавить функции следующим образом:

def remote_ip(request): 
    return {'remote_ip': request.META['REMOTE_ADDR']} 

использовать его в шаблонах lik е {{}} remote_ip

+1

Я новичок в django, ваше объяснение очень полезно, спасибо – Prabu

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