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,inheritance,pyramid,pylons,mako 来源: https://codeday.me/bug/20190710/1420113.html