環境 基本 実践 モデル アップロード デプロイ

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 はフィルターをかけたオブジェクトリストをページクラスに入れた後のオブジェクトリスト。