我正在使用 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 %}
范围内可用。一个可以打电话{% autopaginate object_list %}
在
extra_head
块中,但这将意味着对 db 的额外打击(可能还有其他我不知道的副作用)。有没有一种优雅的方法来解决这个问题,最好尽可能 DRY?编辑:我正在使用 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 -->
现在,要在 head 中获得不同的分页器渲染,您可以使用
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 %}
道德
这并不优雅,原因是应该在
view
中实现分页。 模板仅用于渲染,模板标签也是。 分页进行额外的 sql 查询,它还解析请求中的参数,模板对于这段代码来说是完全错误的地方,因此必须发明解决方法。这些变通方法可能会在 Django 的下一个版本中中断,它们也很微妙,可能会被其他开发人员意外中断。关于django - 使用 django-pagination 生成链接 refl=next/prev,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8133375/