保留筛选条件
本课属于 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 页。
不要在标签前写 ?,否则链接会以 ?? 开头。
挑战
简单在 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 %}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基于类的视图中的所有课
自己练习: Django 在线编辑器