Mako继承了多个文件

时间:2014-10-15 13:23:11

标签: templates inheritance pyramid mako

我有一个金字塔应用程序,每个视图都有多个视图,每个视图取决于一个mako模板。视图非常复杂且没有bug,所以我不想拆分或合并视图,并且通过扩展,相应的模板。

但是,我希望单一视图代表所有其他视图。合并所有金字塔视图和模板实际上不是一种选择。

例如,我有一个登录视图&模板和注册视图&模板。现在我希望我的根页包含它们。 login和signup都继承自base.mak,它包含常见的脚本和样式表导入。以下是我想要的mako导入结构的图形表示。

        base.mak  
       /         \  
login.mak         signup.mak  
       \         /  
        root.mak  

或者,我尝试将它们链接起来: 基地 - >登录 - >注册 - >根

但是,我认为这些观点不再与各自的模板对话。

当我做第3个链(login.mak - >注册)时,我的问题就出现了。我将在下面发布类似和提取代码,因为我的完整代码有点长(如果需要更多代码,请随时大喊)。

base.mak

<!DOCTYPE HTML>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>
            ${next.title()}
        </title> 
        #Imports

        ${next.head()}

    </head>
    <body>
        <div id = "content">
            ${next.body()}
        </div>
    </body> 
</html>

login.mak

<%inherit file="base.mak"/>

<%def name="title()">
    ${next.title()}
</%def>

<%def name="head()">
    ${next.head()}
</%def>

<div id="login">
    <div id="message">
        ${sMessage}
    </div>

    <div id="form">
        <form action="${url}" method="post">      <--- url returned in views.py
...
</div>

${next.body()}

signup.mak

<%inherit file="login.mak"/>

<%def name="title()">
</%def>

<%def name="head()">
</%def>

<div id="box">
...
</div>

现在我的问题是,当我尝试继承时,我的视图中返回的url是未定义的。

然后,当然如果我这样做,添加base.mak来继承注册应该是微不足道的。

我认为有一个简单的解决方法,但是我找不到关于如何在金字塔中执行此操作的示例/解释,其中模板实际上是在做什么。

或者,是否有另一种方法可以将多个金字塔视图和模板组合到一个视图中?

1 个答案:

答案 0 :(得分:1)

好的,我明白了。一个人必须使用mako的<%include/>,然后没有复杂的继承结构。所以,现在我的文件看起来像这样:

root.mak

<%inherit file="base.mak"/>

<%def name="title()">
    Welcome
</%def>

<%def name="head()">
</%def>


<%include file="login.mak"/>
<%include file="signup.mak"/>

<强> login.mak

<%inherit file="base.mak"/>
<%def name="title()">
</%def>

<%def name="head()">
    <link rel="stylesheet" type="text/css" href="${request.static_url(...
</%def>

<div id="login">
    <div id=".....
</div>

与signup.mak结构相同。 base.mak看起来仍然与上面的问题相同。

现在,如果您正在使用金字塔(我假设另一个框架将工作相同),并且您拥有从表单接收和传递信息的视图,然后将它们转换为普通函数(没有@view_config(renderer='path/file.mak')和将他们的功能放在父视图函数中,在我的情况下root。换句话说:

@view_config(renderer='pyramidapp:templates/root.mak',
    context=Root,
    name="")
@forbidden_view_config(renderer='pyramidapp:templates/root.mak')
def root(self):
    xLoginRet = login(self)
    xSignupRet = signup(self)
    #logic and functionality for both, return stuff to go to base.mak