los*_*rje 3 python ajax pyramid chameleon template-tal
我希望能够在服务器端轻松创建由变色龙和金字塔支持的ajax'小部件'.
Pyramid是否提供任何管道代码,使编写小部件变得容易?
我目前的方法是我有一个使用home.pt作为渲染器的主视图.home.pt使用宏base.pt定义页面结构,并为home.pt提供填充的插槽.base.pt还使用了我编写的登录"widget"宏(参见下面的account_login_widget.pt).
从理论上讲,这一切听起来都很棒......我有一个可以在许多页面中使用的可重用登录小部件,但我目前的方法效果不佳.我的登录窗口小部件在其渲染器中使用了像$ {username}这样的变量(服务器需要定义).我希望登录小部件及其渲染尽可能独立.但是根据我目前的做事方式,主视图代码需要了解登录窗口小部件的需求,并在字典中提供用户名,formrender和其他变量.绝对不好......
我觉得我接近正确的想法,但遗漏了一些东西......
有什么想法吗?
base.pt:
<html>
<head></head>
<body>
<div id="container">
<div id="header">
<span metal:use-macro="load: account_login_widget.pt"></span>
</div>
<div id="middle">
<span metal:define-slot="content"></span>
</div>
<div id="footer"></div>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
home.pt:
<div metal:use-macro="load: base.pt">
<span metal:fill-slot="content">
<div>my stuff</div>
</span>
</div>
Run Code Online (Sandbox Code Playgroud)
account_login_widget.pt:
<span metal:define-macro="account_login_widget">
<script type="text/javascript">
(function($) {
$.fn.my_function = function() {
$('#login_form').submit(function(e) {
e.preventDefault();
// ajax call
$.post(some_url, some_data, function(response) {
$('#account_login_widget').html(response);
});
};
return this;
};
})(jQuery);
// Define the entry point
$(document).ready(function() {
$(document).my_function();
});
</script>
<div id="account_login_widget">
<div id="login_bar" tal:condition="not username">
${form_renderer.begin(...)}
... my form ...
${form_renderer.end()}
<span tal:condition="login_failed">Login failed</span>
<div id="forgot_password_link"><a href="#">Forgot Password?</a></div>
<div id="create_account_link"><a href="${signup_url}">Create Account</a></div>
</div>
<div tal:condition="username">
Welcome <strong>${username}</strong>! <a href="${logout_url}">Logout</a>
</div>
</div>
</span>
Run Code Online (Sandbox Code Playgroud)
处理此问题的一个好方法是将account_login_widget与其自己的视图相关联,例如:
@view_config(name='login_widget',
renderer='templates/account_login_widget.pt')
def login_widget(request):
return {'username': ...}
Run Code Online (Sandbox Code Playgroud)
然后,您应该能够访问http:// yourapp/login_widget并仅返回小部件的HTML.
剩下要做的就是调用视图并在模板中包含生成的HTML.也就是说,而不是:
<span metal:use-macro="load: account_login_widget.pt"></span>
Run Code Online (Sandbox Code Playgroud)
你会想要这样的东西:
<span tal:replace="structure render_view('login_widget')"></span>
Run Code Online (Sandbox Code Playgroud)
render_view
但模板中不存在; 你必须自己提供.最好使用Before Render事件:http://docs.pylonsproject.org/projects/pyramid/dev/narr/hooks.html#beforerender-event
from pyramid.events import subscriber
from pyramid.events import BeforeRender
from pyramid.view import render_view_to_response
@subscriber(BeforeRender)
def add_render_view_global(event):
event['render_view'] = lambda name: render_view_to_response(context, request, name, secure).ubody
Run Code Online (Sandbox Code Playgroud)
完成.如果您需要(重新)通过AJAX动态加载小部件,这种方法也会有所帮助.
归档时间: |
|
查看次数: |
1351 次 |
最近记录: |