2

以下のようなことをしたいのですが。

次のルートを構成しています。

config.add_route('home', '/')
config.add_route('foo', '/foo')

次のビュー:

@view_config(route_name='home', renderer='templates/home.pt')
def home_view(request):
    return {...}

@view_config(route_name='foo', renderer='templates/foo.pt')
def foo_view(request):
    return {...}

基本テンプレート'templates/base.pt'があります。

<!DOCTYPE html>
<html>
<head></head>
<body>
    Welcome ${user_id}<br>
    <a href="/foo">Foo</a><br>
    <div id="content">
        <!-- Inject rendered content here from either / or /foo --> 
    </div>
</body>
</html>

私の見解では、次のコンテンツをID「content」でdivに挿入したいと思います。

<!-- templates/home.pt -->
<div id="home-content">Home content</div>

<!-- templates/foo.pt -->
<div id="foo-content">Foo content</div>

上記のhome_viewfoo_viewを変更して、独自のテンプレート(home.pt、foo.pt)をbase.ptに挿入できるようにするにはどうすればよいですか?どういうわけか、 ${user_id}などのデータもbase.ptに転送する必要があります。ビューを定義するときにラッパー引数をいじっていましたが、それがどのように機能するかを理解できませんでした。

4

1 に答える 1

3

これは、いくつかの方法で実現できます(たとえば、ピラミッドまたはカメレオンのドキュメントの概要でのZPTマクロの使用を参照してください)。

単純なケースでは、これが最速の方法だと思います。まず、base.ptファイルを次のように変更します。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal">
<head></head>
<body>
    Welcome ${user_id}<br>
    <a href="/foo">Foo</a><br>
    <div id="content">
        <tal:block metal:define-slot="content">
        </tal:block>
    </div>
</body>
</html>

これはcontent、カメレオンマクロのスロットを定義します。

あなたfoo.ptはこのように見えるかもしれません:

<metal:main
    xmlns:tal="http://xml.zope.org/namespaces/tal"
    xmlns:metal="http://xml.zope.org/namespaces/metal"
    use-macro="load: base.pt">
    <tal:block metal:fill-slot="content">
        <div id="foo-content">Foo content</div>
    </tal:block>
</metal:main>

行に注意してくださいuse-macro="load: base.pthome.pt同じパターンに従う必要があります。user_idおよび他のテンプレート変数はマクロで使用できるため、たとえば、に設定user_idするとUSER、次の/fooようにレンダリングされます。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body>
    Welcome USER<br>
    <a href="/foo">Foo</a><br>
    <div id="content">
        <div id="foo-content">Foo content</div>
    </div>
</body>
</html>
于 2012-02-15T11:33:53.720 に答える