2013-06-27 87 views
4

我们有这个代码,它工作正常。重构后,它不再工作。就像评论所说,如果请求不是ajax请求,我们只想从基本页​​面继承。为此,我们将参数传递给模板,并根据参数继承或不继承。Mako动态模板继承

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

目前,错误的是未定义没有属性__ 的GetItem __。如果我们将$ {inherit(context)}更改为$ {inherit(value)},那么我们得到的全局变量值是未定义的。

+1

你可以尝试把所有的逻辑到inherit标签?只是将函数调用从等式中删除:$ {'base.mak'if context.get('isPage')else None} –

+0

我不认为这是问题所在。我们做了相当大的重构,上面的代码再次运行。我猜传入的上下文没有初始化,或者其中一个模板出现语法错误。 – JeffRegan

+0

另外,请求对象有一个名为is_xhr的属性,如果请求是异步的,则该属性为true。我们使用这个属性来确定我们是否需要加载整个页面。所以is_page = self.request.is_xhr是False – JeffRegan

回答

1

刚刚遇到同样的问题,相同的用例以及实际(渲染布局或不取决于请求是一个XHR)。

可以明显访问request通过context,这样就可以避免不得不在两个地方(视图和模板)逻辑的这一点点分裂:

<%! 
    def inherit(context): 
     if not context.get('request').is_xhr: 
      return 'layout_reports.mako' 
     else: 
      return None 
%> 
<%inherit file="${inherit(context)}"/> 
-1

我不知道这是否工作

%if not request.is_xhr: 
<inherit file='base.mako'/> 
%endif 

Aassuming请求是在上下文中

+0

这是行不通的。模板呈现时无法决定继承。它必须在模块级别块中声明,否则该命令将被忽略。 http://docs.makotemplates.org/en/latest/syntax.html#module-level-blocks另外,我不认为请求被传递给模板,所以这会产生一个异常。 – JeffRegan

+0

我错了有关传递给模板的请求。 – JeffRegan

0

可我们做了一个漂亮的相当大的重构和上面的代码重新工作。我猜传入的上下文没有初始化,或者其中一个模板出现语法错误。

另外,请求对象有一个名为is_xhr的属性,如果请求是异步的,则为true。我们使用这个属性来确定我们是否需要加载整个页面。所以is_page = self.request.is_xhr是False