使用django-pagination生成链接refl = next / prev

我正在使用
django-pagination分页我的页面.它工作得很好,但我想设置

<link rel="prev" href="http://www.example.com/foo/?page=1" />
<link rel="next" href="http://www.example.com/foo/?page=3" />

到< head>,就像是recommended by google.

但是我发现没有办法做到这一点(至少没有额外的查询).首先,我尝试用这样的东西编辑pagination / templates / pagination.html

{% block extra_head %}
<link rel=... ... />
{% endblock %}

哪个当然不起作用(pagination.html包含在{%paginate%}标记中,它不会扩展我的layout.html).接下来,我尝试将/ foo / view的模板修改为类似的内容(添加{%block extra_head%}):

{# foo.html #}
{% extends "layout.html" %}

{% block content %}

{% load pagination_tags %}
{% autopaginate object_list %}
{% paginate %}
{% for obj in object_list %}
  {{ obj }}
{% endfor %}
{% paginate %}

{% endblock %}

{% block extra_head %}
<link rel="prev" href="?page={{ page_obj.previous_page_number }}"/>
{% endblock %}

但这也不起作用,因为page_obj变量仅在{%block content%}的范围内可用. A可以打电话

{% autopaginate object_list %}

在extra_head块中,但这将意味着对数据库的额外命中(以及可能是我不知道的其他副作用).有没有一种优雅的方法来解决这个问题,理想情况下尽可能干燥?

编辑:我正在使用django 1.2.

最佳答案 您可以在更高级别的块中执行{%autopaginate%},然后在子块中可以使用分页对象.如果您没有更高级别的块,则可以在基本模板中执行此操作:

{% block root %}
...
{% endblock %}

在扩展模板中:

{% extends "base.html" %}
{% load pagination_tags %}

{% block root %}
    {% autopaginate objects 10 %}
    {{ block.super }}
{% endblock %}

<!-- the rest of your code -->

现在,要在头部获得不同的paginator渲染,您可以使用with标记:

{% with we_are_in_head=1 %}
    {% paginate %}
{% endwith %}

并使用以下内容覆盖templates/pagination/pagination.html

{% if we_are_in_head %}
    # Your links to next and prev only
{% else %}
    # original code
{% endif %}

一个道德

这不优雅,原因是应该在视图中实现分页.模板仅用于渲染,模板标签也是如此.分页进行额外的sql查询,它还从请求中解析参数,模板对于这段代码是完全错误的地方,因此必须发明变通方法.这些变通办法可能会在下一个django版本中破解,它们也很微妙,可能会被其他开发人员意外破坏.

点赞