Сохранение фильтра
Часть раздела Представления на основе классов путешествия по 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.
Не пишите ? перед тегом, иначе ссылка будет начинаться с ??.
Задание
ЛегкоВ job_list.html сделай так, чтобы обе ссылки пагинации сохраняли остальные параметры строки запроса:
Nextна странице/jobs/?city=Berlinведёт на?city=Berlin&page=2.Previousтоже сохраняет город.- На странице
/jobs/ссылкаNextпо-прежнему ведёт на?page=2.
Нажми Run, а затем 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 %}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Представления на основе классов
2Универсальные представления для отображения
ListViewDetailViewПотренируйтесь самостоятельно: Песочница Django