Menu
CoddyTech

フィルターの維持

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ページ目にも戻ります。

タグの前に?を書かないでください。リンクが??で始まってしまいます。

challenge icon

チャレンジ

簡単

job_list.htmlで、ページネーションの両方のリンクで残りのクエリ文字列を保持するようにしてください。

  • /jobs/?city=BerlinでNextを押すと、?city=Berlin&page=2に移動します。
  • Previousでも都市を保持します。
  • /jobs/では、Nextを押すと引き続き?page=2に移動します。

Runを押して、Berlinの求人一覧でNextを押してください。

自分で試してみよう

{% 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 %}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

クラスベースビューのすべてのレッスン

自分で練習してみよう: Djangoプレイグラウンド