Menu
CoddyTech

Mantener el filtro

Parte de la sección Vistas basadas en clases del Journey de Django de Coddy. Lección 9 de 18.

Abre los empleos de Berlín y pulsa Siguiente: la página 2 muestra empleos de todas las ciudades. El enlace es ?page=2, una cadena de consulta completamente nueva, así que city=Berlin desaparece.

La etiqueta {% querystring %} parte de la cadena de consulta actual, establece los valores que indiques y escribe el resultado, incluido ?. Está integrada desde Django 5.1, así que no necesita {% load %}. Una lista de recetas filtrada por cocina enlaza con una vista ordenada:

<a href="{% querystring sort="minutes" %}">Quickest first</a>

En /recipes/?cuisine=thai, escribe ?cuisine=thai&sort=minutes: el filtro se conserva. Un valor puede ser una variable de plantilla, y None elimina una clave: {% querystring sort="minutes" page=None %} también vuelve a la página 1.

No escribas ? antes de la etiqueta, o el enlace empezará con ??.

challenge icon

Desafío

Fácil

En job_list.html, haz que ambos enlaces de paginación conserven el resto de la cadena de consulta:

  • Next en /jobs/?city=Berlin lleva a ?city=Berlin&page=2.
  • Previous también conserva la ciudad.
  • En /jobs/, Next sigue llevando a ?page=2.

Presiona Run y luego Next en los trabajos de Berlín.

Pruébalo tú mismo

{% 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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Vistas basadas en clases

Practica por tu cuenta: Playground de Django