簡體   English   中英

金字塔和變色龍中的ajax小部件

[英]ajax widgets in pyramid and chameleon

我希望能夠在服務器端輕松創建由變色龍和金字塔支持的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>

home.pt:

<div metal:use-macro="load: base.pt">
<span metal:fill-slot="content">
    <div>my stuff</div>
</span>
</div>

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>

處理此問題的一個好方法是將account_login_widget與其自己的視圖相關聯,例如:

@view_config(name='login_widget',
             renderer='templates/account_login_widget.pt')
def login_widget(request):
    return {'username': ...}

然后,您應該能夠訪問http:// yourapp / login_widget並僅返回小部件的HTML。

剩下要做的就是調用視圖並在模板中包含生成的HTML。 也就是說,而不是:

<span metal:use-macro="load: account_login_widget.pt"></span>

你會想要這樣的東西:

<span tal:replace="structure render_view('login_widget')"></span>

但是,模板中不存在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

完成。 如果您需要(重新)通過AJAX動態加載小部件,這種方法也會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM