Menu
CoddyTech

Сохранение фильтра

Часть раздела Представления на основе классов путешествия по Django на Coddy. Урок 9 из 18.

Откройте вакансии в Берлине и нажмите «Далее»: на странице 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.

Нажми Berlin, затем Next: на странице 2 отображаются только вакансии в Берлине.

Попробуйте сами

{% 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