私の目標
- すべてのアップデート(モデル)を表にリストするサイト
- すべてのモデルを一度に表示しない(ページネーション - 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>