4

我正在使用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>,喜欢的是google推荐的

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

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

哪个当然不起作用({% paginate %}标签包含 pagination.html,它不会扩展 my layout.html)。接下来,我尝试将 /foo/ 视图的模板修改为类似这样的内容(添加{% 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块中,但这意味着对数据库的额外打击(可能还有其他我不知道的副作用)。有没有一种优雅的方法来解决这个问题,理想情况下尽可能干燥?

编辑:我正在使用 django 1.2。

4

2 回答 2

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 的下一个版本中中断,它们也很微妙,可能会被其他开发人员意外破坏。

于 2011-11-15T09:26:09.877 回答
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)
于 2015-07-10T08:48:35.953 回答