Conserver le filtre
Fait partie de la section Vues basées sur des classes du Journey Django de Coddy. Leçon 9 sur 18.
Ouvre les offres d’emploi de Berlin et appuie sur Suivant : la page 2 répertorie les offres de toutes les villes. Le lien est ?page=2, une toute nouvelle chaîne de requête, donc city=Berlin a disparu.
La balise {% querystring %} part de la chaîne de requête actuelle, définit les valeurs que tu indiques et écrit le résultat, y compris ?. Elle est intégrée depuis Django 5.1, donc elle ne nécessite pas de {% load %}. Une liste de recettes filtrée par cuisine propose un lien vers une vue triée :
<a href="{% querystring sort="minutes" %}">Quickest first</a>Sur /recipes/?cuisine=thai, elle écrit ?cuisine=thai&sort=minutes : le filtre est conservé. Une valeur peut être une variable de gabarit, et None supprime une clé : {% querystring sort="minutes" page=None %} revient également à la page 1.
N’écris pas de ? avant la balise, sinon le lien commence par ??.
Défi
FacileDans job_list.html, faites en sorte que les deux liens de pagination conservent le reste de la chaîne de requête. Sur /jobs/?city=Berlin, Next mène à ?city=Berlin&page=2, et Previous conserve aussi la ville. Sur /jobs/, Next mène toujours à ?page=2.
Cliquez sur Berlin, puis sur Next : la page 2 affiche uniquement les offres de Berlin.
Essayez vous-même
{% 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 %}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Vues basées sur des classes
Entraînez-vous par vous-même : Playground Django