[英]access variable declared in child template or controller-wide variables
我有一个小的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中返回它。
这是一个相当古老的问题,但在这里,我想它可能会成功。 请记住,当您编写模板时,实际上您实际上是在显示函数body()
。
我的猜测是, 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
。
这就是它。
这个答案是你的“其他问题”:)
您可以将视图定义为Controller类上的方法。 这样,您可以将Controller范围的变量输出分解为常用方法:
from pyramid.view import view_config
from myproject.resources import MyResource
class MyController(object):
def __init__(self, request):
self.request = request
def respond(self, additionalVars):
additionalVars['myCommonVar1'] = 'common value'
return additionalVars
@view_config(
context='myproject.resources:MyResource',
request_method='GET',
renderer='one.mak')
def get_one(self):
return self.respond({'var2':'sth'})
@view_config(
context='myproject.resources:MyResource',
name = 'two',
request_method='GET',
renderer='two.mak')
def get_two(self):
return self.respond({'var3':'sth else'})
嗯......我已经多年没有在挂架上写任何东西,也没有安装任何挂架来检查它。 但请尝试编写next.mainactions
而不是self.mainactions
,看看会发生什么。
这个答案很老,所以我不知道你是否已经解决了这个问题。
一种可行的方法是在view()def中移动你的python块。 这样,变量实际上将在base.mako中调用。
在我自己的应用程序中,我创建了一个view
对象,其中包含我在整个应用程序中需要的一组上下文变量,例如view.page,view.perpage等。在每个可调用的视图上,我启动此view
(从中计算上下文变量)自动获取,post_data,路由等)并将其作为上下文变量传递。 因此,您始终可以传递view.mainactions,并且只要您将其保留为None,就不会遇到应用程序中的任何KeyErrors。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.