python – 在子模板或控制器范围的变量中声明的访问变量

我有一个小的mako模板层次结构,如下所示:

base.mako

<h1>${self.view()}</h1>
${listactions(self.mainactions)}
${self.body()}

<%def name="listactions(actions)">
    <ul>
    % for action in actions:
        <li>${action}</li>
    % endfor
    </ul>
</%def>

clientsbase.mako

<%inherit file="base.mako"/>
<%def name="view()">Clients</%def>
<%
    mainactions = [request.route_url('clientsnew')]
%>

clientsindex.mako

<%inherit file="clientsbase.mako"/>
This is the index

问题是当我尝试访问客户端索引视图时呈现clientsindex.mako我得到错误AttributeError:命名空间’self:/base.mako’没有成员’mainactions’.

应该怎样做才能做到这一点?我已经浏览了mako文档,到目前为止我发现的是我可以使用模块级python块来声明mainactions,然后在base.mako中执行self.attr.mainactions.问题在于此块我无法访问请求对象.

我想另一个问题是:在我的情况下,我使用函数作为view-callables,但是假设我已经编写了一个单独的clients.py视图文件,其中包含与客户端相关的所有视图.有没有办法从clients.py文件中以某种方式设置类似控制器范围的上下文变量?这样我就可以在模板的上下文中设置一个mainactions变量,而不必在每个视图的dict中返回它.

最佳答案
这是一个相当古老的问题,但在这里,我想它可能会成功.请记住,当您编写模板时,实际上您实际上是在显示函数体().

我的猜测是,mainactions被定义为self.body()的局部变量.但是一切都很酷,因为我们可以获得自我…

所以不要写:

mainactions = [request.route_url('clientsnew')]

你应该尝试写:

self.mainactions = [request.route_url('clientsnew')]

也就是说,这并不是实现您想要做的事情的好方法.如果我是你,我会使用def或block来做.

base.mako

<h1>${self.view()}</h1>
<%block name="mainaction">
</%block>
${self.body()}

<%def name="listactions(actions)">
    <ul>
    % for action in actions:
        <li>${action}</li>
    % endfor
    </ul>
</%def>

clientbase.mako

<%inherit file="base.mako"/>
<%def name="view()">Clients</%def>
<%block name="mainaction"
    ${request.route_url('clientsnew')}
</%block>

剩下的不会改变… def的东西是你只是覆盖了父母的def,然后在base.mako中你使用你想要的def.

这就是它.

转载注明原文:python – 在子模板或控制器范围的变量中声明的访问变量 - 代码日志