3

サーバー側でカメレオンとピラミッドに支えられた 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>
4

1 に答える 1

8

これに対処する良い方法は、次のように 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ただし、テンプレートには存在しません。自分で提供する必要があります。これにはレンダリング前イベントを使用するのが最善です: 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 を介してウィジェットを動的に (再) ロードする必要がある場合にも役立ちます。

于 2011-11-09T11:50:51.093 に答える