2013-10-24 7 views
6

ユーザーがログインしたときの基本テンプレートがあり、その基本テンプレートにドロップダウンメニューでユーザー固有のオプションを追加する必要があります。オプション付きのこのドロップダウンメニューは、すべてのハンドラにわたって、すなわち、子テンプレートで基本テンプレートが呼び出される(拡張される)たびに一定でなければならない。PyramidとJinja 2のテンプレートでグローバルデータと関数を公開する

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

私は、はるかにシンプルでメンテナンスできるものと引き換えに、とても扱いにくい何かをしたくないです。

アイデア?ありがとう。


EDIT

だから私はまだ私が探しているまさに何だ何かを発見していません。しかし、私は少なくともその途中で進んでいくことに決めました。そこで、私はビューの返された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... 

答えて

5

これがピラミッドの中で最もinobviousものの一つであり、私のために見つけるためにしばらく時間がかかりました、あまりにも。

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

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

また、あなたは、クラスのインスタンスは、すべてのビューにテンプレートコンテキストに渡されget_base_data()を、持っている一つのベースビュークラスからのすべてのあなたの意見を継承し、クラスベースのビューを使用することができますし、あなたが抽出できました{{ view.get_base_data }}のデータ。

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

それはより美しく、予測可能かつ賢明なエンジニアリングを維持することが容易であるように私は、後者のアプローチを保証します。

+0

これは素晴らしいことですが、本当に助けてくれてありがとうございます。私は同意する、クラスベースのビューのアプローチは、よりエレガントなようです。 – JohnZ

関連する問題