我正在使用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 %}
当然哪个不起作用({% paginate %}
标记包含pagination.html,它不会扩展我的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
块中的,但这意味着db的额外命中(以及可能是我不知道的其他副作用)。有没有一种优雅的方法来解决这个问题,理想情况下尽可能干燥?
编辑:我正在使用django 1.2。
答案 0 :(得分: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 %}
道德
这不优雅,原因是分页应该在view
中实施。 模板也只用于渲染,模板标签也是。分页会产生额外的sql查询,它也会从请求中解析参数,模板对于这段代码来说是完全错误的地方,所以必须发明变通方法。这些解决方法可能会在下一个django版本中破解,它们也很微妙,可能会被其他开发人员意外破坏。
答案 1 :(得分:0)
我们可以在视图中调用autopaginate
,然后像往常一样使用{% paginate %}
。如果某人仍然面临所描述的问题,这是一个秘诀:
from pagination.templatetags.pagination_tags import AutoPaginateNode
def autopaginate(request, context, queryset_var, paginate_by):
""" It allows us to use paginated objects in different template blocks """
autopagination = AutoPaginateNode(queryset_var, paginate_by)
# Inject a request - it's required by `autopagination` function
context['request'] = request
autopagination.render(context)