6

ユーザーがログインしたときの基本テンプレートがあり、その基本テンプレートで、ドロップダウン メニューにユーザー固有のオプションを追加する必要があります。オプションを含むこのドロップダウン メニューは、すべてのハンドラーで一定でなければなりません。つまり、基本テンプレートが子テンプレートで呼び出される (拡張される) ときはいつでもです。

必要な DB クエリを実行し、クエリ結果を変数に割り当て、その変数をすべてのハンドラー (多数あります) に渡す以外に、これを 1 つのクエリと 1 つの変数に統合して、ベース テンプレートに直接渡すにはどうすればよいでしょうか? 私jinja2もテンプレートを使用しています。

はるかにシンプルで保守しやすいものと引き換えに、それほど面倒なことをするのは嫌です。

何か案は?ありがとう。


編集

そのため、探しているものとまったく同じものはまだ見つかりません。ただし、暫定的に少なくともある程度の前進を遂げることにしました。そこで、ビューから返された dict() を受け取り、それに適切なデータを追加するカスタム デコレータを作成しました。例えば:

def get_base_data(func):
    def wrapper(request):
        d = func(request)
        user_id = request.user.id  # used in query
        contact_group_data = ContactGroups.query.filter(...criteria...).all()
        d['contact_group_data'] = contact_group_data
        return d
    return wrapper

これで、次のように記述することで、少なくとも各メソッドを非常に簡潔かつ簡単に装飾できます。

@view_config(...)
@get_base_data
def my_handler(request):
    pass  # rest of code...
4

1 に答える 1

6

これは Pyramid で最も目立たないものの 1 つであり、私も見つけるのに時間がかかりました。

BeforeRenderイベントでグローバル テンプレート コンテキストを変更できます。

http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/hooks.html#using-the-before-render-event

または、クラス ベースのビューを使用して、 を持つ 1 つの基本ビュー クラスからすべてのビューを継承しget_base_data()、クラス インスタンスをすべてのビューのテンプレート コンテキストに渡してから、 を使用してデータを抽出することもできます{{ view.get_base_data }}

http://ruslanspivak.com/2012/03/02/class-based-views-in-pyramid/

後者のアプローチの方が美しく、予測可能で、エンジニアリングの観点から維持しやすいため、私は後者のアプローチを保証します。

于 2013-10-25T07:15:02.963 に答える