Djangoのページ機能:GETのパラメーターをテンプレートタグでうまく管理する
2022.11.23
Django でページ機能をつける場合、page は url のクエリからとってくる。取得そのものは簡単だが、ページ遷移した時、クエリがどんどんつながってしまうという問題がある。
http://127.0.0.1:8000/search?filter=post&query=&page=1&page=2&page=3&page=4
遷移するたびに page クエリがつながってしまうのだ。これをなんとかするにはテンプレートタグを使う。
結論
ページそのものは次のようにする。
<ul class="pagination">
{% if posts.has_previous %}
<li>
<a href="?{% url_replace request 'page' posts.previous_page_number %}">
前へ
</a>
</li>
{% endif %}
{% if posts.has_next %}
<li>
<a href="?{% url_replace request 'page' posts.next_page_number %}">
次へ
</a>
</li>
{% endif %}
</ul>
テンプレートタグは次のようにする。
@register.simple_tag
def url_replace(request, field, value):
dict_ = request.GET.copy()
dict_[field] = value
return dict_.urlencode()
メモ
上の posts はフィルターをかけたオブジェクトリストをページクラスに入れた後のオブジェクトリスト。