5

トラバーサルを使用する単純なピラミッド ベースの CMS を作成しています。などのCollectionサブクラスを持つというクラスがあります。NewsCollectionGalleriesCollection

これらのコレクションを表示するには、2 種類のビューが必要です。フロントエンドの html ビューとバックエンドの json ビュー (管理パネルは dgrid を使用してデータを表示します)。バックエンド ビューは一般的なものにすることができます。すべてのケースで json データをダンプします。フロントエンド ビューはそうすべきではありません - あらゆる種類のデータ用のカスタム テンプレートがあります。

問題は次のとおりです。次のようにビューを構成すると:

@view_config(context=Collection, xhr=True, renderer='json', accept='application/json')

それは正しく動作します。ただし、このビュー用に構成されたビューを追加するとすぐに優先NewsCollectionされます。上記の構成と競合するように具体的に述語を配置しても (例: accept='text/html')、上記のビューは呼び出されません。代わりに、「述語の不一致」が発生します。

Collection私の質問は - のビューもある場合に呼び出されるように構成されたビューを作成するために何かできることはありますNewsCollectionか? または、他の設計を使用する必要がありますか ( URL ディスパッチや、異なるリソース タイプに対して同じビューを複数回追加するなど)。

4

1 に答える 1

6

私は非常によく似たシステムを構築しようとしましたが、同じ問題を発見しました-実際、Pyramidバグトラッカーのチケットは次のとおりです:https ://github.com/Pylons/pyramid/issues/409

つまり、Pyramidのすべてのビュー述語が等しいわけではありません-contextこれは特殊なケースです。ビューは最初にを使用して照合contextされ、次に他の述語を使用して選択が絞り込まれます。

Pyramidをあなた(および私)が期待するように動作させる最近のプルリクエストもありますが、そこでの議論から、パフォーマンスのトレードオフの可能性があるため、採用される可能性は非常に低いことがわかります。

更新:プルリクエストは2013年3月にマージされたため、1.4以降のリリースで利用可能になるはずです)

回避策は、カスタム述語を使用することです。

def context_implements(*types):
    """
    A custom predicate to implement matching views to resources which
    implement more than one interface - in this situation Pyramid has
    trouble matching views to the second registered interface. See
    https://github.com/Pylons/pyramid/issues/409#issuecomment-3578518

    Accepts a list of interfaces - if ANY of them are implemented the function
    returns True
    """
    def inner(context, request):
        for typ in types:
            if typ.providedBy(context):
                return True
        return False
    return inner


@view_config(context=ICollection,
    custom_predicates=(context_implements(INewsCollection),)
    )
def news_collection_view(context, request):
    ....
于 2013-02-14T13:46:26.983 に答える