Мако Динамическое наследование шаблонов

У нас был этот код, и он работал нормально. После рефакторинга он больше не работает. Как говорится в комментарии, мы хотим наследовать от базовой страницы, только если запрос не является 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

Подтверждающий запрос доступен в контексте

Другие вопросы по тегам