4

我有一个小的 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>

客户群.mako

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

客户索引.mako

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

问题是当我尝试访问呈现 clientsindex.mako 的客户端索引视图时,我收到错误AttributeError: Namespace 'self:/base.mako' has no member 'mainactions'

这样做的正确方法应该是什么?我已经浏览了 mako 文档,到目前为止我发现我可以使用模块级 python 块来声明 mainactions ,然后在 base.mako 中执行self.attr.mainactions。问题在于这个块内我无权访问请求对象。

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

4

4 回答 4

1

这是一个相当古老的问题,但在这里,我想它可能会奏效。请记住,当您编写模板时,实际上默认显示的是 function body()

我的猜测是,mainactions它被定义为self.body(). 但是一切都很酷,因为我们确实可以访问自我......

所以不要写:

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

您应该尝试编写:

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

也就是说,这并不是实现您想要做的事情的好方法。如果我是你,我会使用defor 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>

客户群.mako

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

其余的没有改变...... def 的事情是你只是覆盖了def父级,然后在你想要base.mako的地方使用def

差不多就是这样。

于 2012-06-27T21:42:41.713 回答
0

Hmmm... I have not written anything in pylons for ages nor do I have any pylons installation to check it. But please try to write next.mainactions instead of self.mainactions and see what happens.

于 2011-04-06T14:19:19.997 回答
0

这个答案很旧,所以我不知道你是否已经解决了这个问题。

一种可行的方法是在 view() def 中移动你的 python 块。这样,该变量实际上将在 base.mako 中调用。

在我自己的应用程序中,我创建了一个view对象,其中包含我在整个应用程序中需要的一堆上下文变量,例如 view.page、view.perpage 等。在每个可调用的视图上,我都会启动它view(从获取计算上下文变量, post_data、路由等)并将其作为上下文变量传递。因此,您始终可以传递 view.mainactions,并且您不会在您的应用程序中遇到任何 KeyErrors,只要您默认保持它为 None。

于 2011-12-13T20:18:27.843 回答
0

这个答案是你的“其他问题”:)

您可以将视图定义为 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'})
于 2012-09-12T07:51:41.677 回答