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。

点击 Berlin,然后点击 Next:第 2 页只会列出 Berlin 的工作。

亲手试试

{% 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 在线编辑器