Мако Динамическое наследование шаблонов
У нас был этот код, и он работал нормально. После рефакторинга он больше не работает. Как говорится в комментарии, мы хотим наследовать от базовой страницы, только если запрос не является ajax-запросом. Для этого мы передаем параметр в шаблон и, основываясь на этом параметре, наследуем или нет.
View.py
class Router(object):
def __init__(self, request):
self.request = request
@view_config(route_name="home")
def get(self):
template = "home.mak"
value = {'isPage':self.request.is_xhr is False}
return render_to_response(template, value, request=self.request)
Template.mak
##conditional to determine with the template should inherit from the base page
##it shouldn't inherit from the base page is it is being inserted into the page using ajax
<%!
def inherit(context):
if context.get('isPage') == True:
return "base.mak"
else:
return None
%>
<%inherit file="${inherit(context)}"/>
В настоящее время ошибка Undefined не имеет атрибута __getitem__. Если мы изменим ${наследовать (контекст)} на ${наследовать (значение)}, мы получим значение глобальной переменной не определено.
3 ответа
Просто столкнулся с той же проблемой, с тем же сценарием использования (фактически, рендеринг макета или нет в зависимости от того, что запрос XHR)
Вы можете получить доступ к request
через context
Таким образом, вы можете избежать необходимости разделять эту крошечную логику на два места (представление и шаблон):
<%!
def inherit( context ):
if not context.get('request').is_xhr:
return 'layout_reports.mako'
else:
return None
%>
<%inherit file="${inherit(context)}"/>
Мы сделали довольно значительный рефакторинг, и приведенный выше код снова работает. Я предполагаю, что передаваемый контекст не был инициализирован или в одном из шаблонов была синтаксическая ошибка.
Кроме того, у объекта запроса есть свойство is_xhr, которое имеет значение true, если запрос асинхронный. Мы используем это свойство, чтобы определить, нужно ли нам загружать полную страницу или нет. Так что is_page = self.request.is_xhr является ложным
Я не уверен, работает ли это или нет
%if not request.is_xhr:
<inherit file='base.mako'/>
%endif
Подтверждающий запрос доступен в контексте