Эквивалент контекста шаблона в Pyramid (пользователь pylons) - PullRequest
13 голосов
/ 02 апреля 2011

Что эквивалентно контексту шаблона в пирамиде?

Имеет ли отношение событие IBeforeRender в пирамиде к этому? Я просмотрел официальную документацию, но с трудом понял, что именно представляет собой событие IBeforeRender.

Ответы [ 6 ]

11 голосов
/ 12 апреля 2011

Pyramid уже предоставляет tmpl_context в своем объекте Request, так что достаточно просто подписать событие BeforeRender, чтобы добавить его в глобальные переменные рендерера:

def add_renderer_globals(event):
    event['c'] = request.tmpl_context
    event['tmpl_context'] = request.tmpl_context

config.add_subscriber(add_renderer_globals, 'pyramid.events.BeforeRender')

Теперь вКод, когда вы получаете запрос, вы можете установить параметры для него:

request.tmpl_context.name = 'Bob'

И впоследствии ваш шаблон может ссылаться на переменную name:

${ c.name }
6 голосов
/ 12 апреля 2011

Если вместо этого вы надеетесь на какую-то «глобальную сумку», в которой вы можете заполнить переменные, которые будут доступны для каждого шаблона, тогда ваш вопрос о IBeforeRender уместен.

from pyramid.events import subscriber
from pyramid.events import BeforeRender

@subscriber(BeforeRender)
def add_global(event):
    event['name'] = 'Pyramid Developer'

Существует также альтернативный способ добавления глобалов при настройке Конфигуратора.Вы можете увидеть полную информацию по адресу: http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/hooks.html#using-the-before-render-event

2 голосов
/ 29 ноября 2011

Мне кажется, что приведенные выше решения точно не копируют поведение контекста шаблона Pylons. Если кто-то отображает запрос страницы в Pylons и добавляет некоторое значение a в контекст c, он доступен в шаблоне как c.a. Однако, если один из них выполняет другой запрос, этот ключ / значение будет отброшено.

Решения пирамиды выше показывают другое поведение. ключ / значение c.a останется в контексте шаблона. Иногда это не желательно. Есть какие-нибудь предложения, чтобы исправить эту разницу?

1 голос
/ 12 апреля 2011

Pyramid на самом деле не предоставляет «контекст шаблона» разработчику (хотя он используется внутри различных привязок механизма шаблонов для Pyramid).

Обычно, если вы хотите вставить что-то в «c» для использования внутри шаблона, вы просто передаете это как аргумент ключевого слова в вызов render_to_response () или как часть dict, который вы возвращаете с предопределенным средством визуализации.

Чтобы сделать что-то похожее на http://pylonsbook.com/en/1.1/using-view-templates.html#using-the-template-context-c-global, вы должны сделать:

@view_config(renderer="greeting.mako")
def index(request):
    return {'name': 'Pyramid Developer'}

И приветствие.mako:

<html>
<head>
    <title>Greetings</title>
</head>
<body>
    <h1>Greetings</h1>
    <p>Hello ${name}!</p>
</body>
</html>
0 голосов
/ 17 февраля 2016

От Пилоны магических глобалов раздел Пирамидальная поваренная книга :

Pylons имеет несколько магических глобалов, которые содержат данные о состоянии для текущий запрос Вот ближайшие эквиваленты пирамиды:

(...)

pylons.tmpl_context

Скретч-объект для локальных данных запроса, обычно используемый для передачи данных к шаблону. В пирамиде вы возвращаете набор переменных и позволяете средство визуализации применяет их к шаблону. Или вы можете сделать шаблон код себя в поле зрения.

Если представление является методом, вы также можете установить переменные экземпляра. Вид Экземпляр виден как view в шаблонах. Есть два основных варианта использования за это. Один, чтобы установить переменные для шаблона сайта, который будет в противном случае должно быть в каждом возвращении. Два, для переменных, которые специфично для рендеринга HTML, когда представление зарегистрировано как HTML-рендерер и не-HTML рендерер (например, JSON).

Пирамида имеет порт "tmpl_context" в request.tmpl_context, который отображается в шаблонах как c. Тем не менее, он никогда не завоевывал популярность среди Пользователи Pyramid-Pylons и больше не документированы.

0 голосов
/ 06 августа 2011

Если вы ищете глобальный словарь для удобной передачи переменных между шаблонами и представлениями, используйте pyramid.request.TemplateContext

На странице шаблона:

<%!
    from pyramid.request import TemplateContext as c
    c.foo = 123
%>

Затем вы можете получить доступ к переменной, импортировав TemplateContext в ваши представления таким же образом:

from pyramid.request import TemplateContext as c

Это должно быть более или менее эквивалентно tmpl_context в пилонах.

...