2

クエリセットの結果をユーザーに表示するページがあります。私がやりたいことは、ユーザーがフィルターを適用するためにリンクをクリックできるようにすることです。

現在私がしていることは、フィルターを適用するためにリンクに「get」パラメーターをページに渡すことです。フィルターは、他のモデルまたはカスタム フィルター (割り当てられていないフィルターなど) への参照にすることができます。

適切なユーザー エクスペリエンスを提供するために、実装でいくつかのことを行う必要があります。

  • ビューで:
    1. 渡されたフィルターパラメーターが有効であることを確認してください
    2. クエリセットに正しい条件を適用するために、(他のモデルまたはカスタム フィルターに基づいて) フィルターの種類を確認します。
    3. (オプション) フィルターを累積する方法 (つまり、フィルターを追加し続けることができます)
  • テンプレートで:
    1. 選択したフィルターに基づいて正しい結果セットを表示する
    2. フィルターを表示するときに、適用したフィルターを認識して、現在適用されているフィルターがハイパーリンクではなくテキストとして表示されるようにします。

これは、ビューとテンプレートの if/else ステートメントの明白な強打以外に、誰かがデザイン パターンやベスト プラクティスのようなものを見つけなければならないほど一般的であるに違いないと考えています。

ある?

4

1 に答える 1

1

Django 管理者がこの種の機能を処理する方法は、優れたパターンだと思います。よくわからない場合list_filterは、管理者のオプションを確認してください。あなたが説明しているものと似ていますが、あなたのものはもう少し一般的です。おそらく、これはいくつかのアイデアを熟考するのに役立ちますか?

  • まず、実際のクエリ文字列チャンクについては、Django-ORM ルックアップ キーと値のペアを渡すだけです。例: 、?sites__id__exact=1などtags__in=words。クロスモデル ルックアップを可能にしたいので、モデル名を含めるために文字列に別の部分を提供する必要がありますが、それほど難しくはありません。

  • フィルターが有効かどうかを確認するには、モデル/フィールド ルックアップが有効であることを確認するだけです。各 QS チャンクの部分を分割することで、モデル、フィールド名、ルックアップ、および値を識別できます。次に、Django の組み込み機能を使用して、フィールド名がモデルに存在することを検証します。これは、ForeignKey でも実行できます。これがDjangoのやり方です

  • これにフィルターを簡単に追加し続けることができます。ビューと、これらのフィルターを表示するフォームに何らかのコンテキストを提供することで、フィルターが保持され、ユーザーに再入力されます。また、クエリ文字列を簡単に永続化することもできます。基本的に、ここでは常に同じ読み取り/解析機能を使用できますが、実際には何も違いはありません。

キーは自動化され、可能な限り DRY に保たれていると思います。たくさんの if ステートメントに屈しないでください。これらのルックアップを安全に ORM に渡すのは非常に簡単です。また、不適切なルックアップを見つけて、意味のあるエラー メッセージをユーザーに提供するのも非常に簡単です。

それがあなたの道に役立つことを願っています!:)

于 2012-10-05T03:29:02.133 に答える