我有一个金字塔应用程序,每个视图都有多个视图,每个视图取决于一个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来继承注册应该是微不足道的。
我认为有一个简单的解决方法,但是我找不到关于如何在金字塔中执行此操作的示例/解释,其中模板实际上是在做什么。
或者,是否有另一种方法可以将多个金字塔视图和模板组合到一个视图中?
答案 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