フィルターの維持
CoddyのDjangoジャーニー「クラスベースビュー」セクションの一部。レッスン 9/18。
Berlinの求人を開いて「次へ」を押します。2ページ目にはすべての都市の求人が表示されます。リンクは?page=2で、新しいクエリー文字列全体になるため、city=Berlinはなくなります。
{% querystring %}タグは現在のクエリー文字列を基に、指定した値を設定して、?も含めた結果を書き出します。Django 5.1以降に組み込まれているため、{% load %}は必要ありません。料理の種類で絞り込んだレシピ一覧から、並べ替えた表示へのリンクを作成できます。
<a href="{% querystring sort="minutes" %}">Quickest first</a>/recipes/?cuisine=thaiでは、?cuisine=thai&sort=minutesが書き出され、絞り込み条件が維持されます。値にはテンプレート変数を指定でき、Noneを指定するとキーが削除されます。{% querystring sort="minutes" page=None %}を使うと、ページ1にも戻ります。
タグの前に?を書かないでください。リンクが??で始まってしまいます。
チャレンジ
簡単job_list.htmlで、両方のページネーションリンクでクエリ文字列の残りの部分が保持されるようにしてください。/jobs/?city=Berlinでは、Nextは?city=Berlin&page=2に移動し、Previousでも都市が保持されます。/jobs/では、Nextは引き続き?page=2に移動します。
BerlinをクリックしてからNextをクリックすると、2ページ目にはBerlinの求人だけが表示されます。
自分で試してみよう
{% extends "jobs/base.html" %}
{% block title %}Jobs{% endblock %}
{% block content %}
<h1>Jobs</h1>
<p class="cities">
<a href="{% url 'jobs:list' %}">All cities</a>
<a href="?city=Berlin">Berlin</a>
<a href="?city=Lisbon">Lisbon</a>
<a href="?city=London">London</a>
</p>
<ul class="jobs">
{% for job in jobs %}
<li class="job">
<a href="{% url 'jobs:detail' job.slug %}"><strong>{{ job.title }}</strong></a>
at {{ job.company }}, {{ job.city }}
</li>
{% empty %}
<li>No jobs yet.</li>
{% endfor %}
</ul>
{% if is_paginated %}
<nav class="pages">
{% if page_obj.has_previous %}
<a href="?page={{ page_obj.previous_page_number }}">Previous</a>
{% endif %}
<span>Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">Next</a>
{% endif %}
</nav>
{% endif %}
{% endblock %}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
クラスベースビューのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド