Django ListView - フィルタリングと並べ替えを行うフォーム 質問する

Django ListView - フィルタリングと並べ替えを行うフォーム 質問する

私の目標

  • すべてのアップデート(モデル)を表にリストするサイト
  • すべてのモデルを一度に表示しない(ページネーション - 1 ページあたり 10 個程度)
  • リストをフィルタリングして並べ替える

私の考え

  • ListViewを使用してすべての更新情報を取得できます
  • paginate_by = 10 を使用する
  • フォームを使用してクエリセットで order_by または filter を設定する

私の問題

フィルターと並べ替えを使用して QuerySet を変更するフォームを追加する方法がわかりません。私のアイデアは、追加のフィルターと order_by を使用して get_queryset のクエリを変更することでした。

私の見解

class MyView(ListView):
    model = Update
    template_name = "updates/update.html"
    paginate_by = 10

    def get_queryset(self):
        return Update.objects.filter(
            ~Q(state=Update.STATE_REJECTED),
            ~Q(state=Update.STATE_CANCELED),
            ~Q(state=Update.STATE_FINISHED),
        ).order_by(
            'planned_release_date'
        )

私のアイデア

こんな感じです。このようには機能しないことはわかっていますが、説明のために

class MyView(ListView):
    model = Update
    template_name = "updates/update.html"
    paginate_by = 10

    def post(self, request, *args, **kwargs):
        new_context = Update.objects.filter(
            request.POST.get("filter"),
        ).order_by(
            request.POST.get("sorting"),
        )

    def get_queryset(self):
        return Update.objects.filter(
            ~Q(state=Update.STATE_REJECTED),
            ~Q(state=Update.STATE_CANCELED),
            ~Q(state=Update.STATE_FINISHED),
        ).order_by(
            'planned_release_date'
        )

ベストアンサー1

投稿は必要ありません。URL でフィルター値と order_by を渡します。例:

.../update/list/?filter=filter-val&orderby=order-val

そして、次のように get_queryset でフィルターと orderby を取得します。

class MyView(ListView):
    model = Update
    template_name = "updates/update.html"
    paginate_by = 10

    def get_queryset(self):
        filter_val = self.request.GET.get('filter', 'give-default-value')
        order = self.request.GET.get('orderby', 'give-default-value')
        new_context = Update.objects.filter(
            state=filter_val,
        ).order_by(order)
        return new_context

    def get_context_data(self, **kwargs):
        context = super(MyView, self).get_context_data(**kwargs)
        context['filter'] = self.request.GET.get('filter', 'give-default-value')
        context['orderby'] = self.request.GET.get('orderby', 'give-default-value')
        return context

フィルターと順序に適切なデフォルト値を指定してください

サンプルフォーム(必要に応じて変更できます):

<form method="get" action="{% url 'update-list' %}">
    <p>Filter: <input type="text" value={{filter}} name="filter"/></p>
    <p>order_by: <input type="text" value={{orderby}} name="orderby"/></p>
    <p><input type="submit" name="submit" value="submit"/></p>
</form>

おすすめ記事