首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用django-pagination生成link refl=next/prev

使用django-pagination生成link refl=next/prev
EN

Stack Overflow用户
提问于 2011-11-15 16:24:14
回答 2查看 995关注 0票数 4

我正在使用django-pagination对页面进行分页。它工作得很好,但我想设置

代码语言:javascript
复制
<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一样。

然而,我发现ho没有办法做到这一点(至少没有额外的查询)。首先,我尝试使用如下所示的内容编辑pagination/templates/pagination.html

代码语言:javascript
复制
{% block extra_head %}
<link rel=... ... />
{% endblock %}

这当然不起作用(pagination.html包含在{% paginate %}标签中,它不会扩展我的layout.html)。接下来,我尝试将/foo/ view的模板修改为如下所示(添加{% block extra_head %}):

代码语言:javascript
复制
{# 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可以调用

代码语言:javascript
复制
{% autopaginate object_list %}

extra_head块中,但这将意味着对db的额外命中(可能还有其他我不知道的副作用)。有没有一种优雅的方法来解决这个问题,最好是尽可能的干练?

编辑:我使用的是django 1.2。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-15 17:26:10

您可以在更高级别的块中执行{% autopaginate %},然后分页的对象将在子块中可用。如果你没有更高级别的模块,可以在基本模板中这样做:

代码语言:javascript
复制
{% block root %}
...
{% endblock %}

在扩展模板中:

代码语言:javascript
复制
{% extends "base.html" %}
{% load pagination_tags %}

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

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

现在,为了在head中以不同的方式呈现分页器,您可以使用with标记:

代码语言:javascript
复制
{% with we_are_in_head=1 %}
    {% paginate %}
{% endwith %}

并用下面这样的代码覆盖templates/pagination/pagination.html

代码语言:javascript
复制
{% if we_are_in_head %}
    # Your links to next and prev only
{% else %}
    # original code
{% endif %}

A道德

这并不优雅,原因是分页应该在view中实现。分页会产生额外的查询,它也会解析请求中的参数,模板完全不适合这种代码,所以必须发明变通的方法。这些变通方法可能会在django的下一个版本中被破坏,它们也是微妙的,可能会被其他开发人员意外破坏。

票数 2
EN

Stack Overflow用户

发布于 2015-07-10 16:48:36

我们可以在视图中调用autopaginate,然后像往常一样使用{% paginate %}。如果有人仍然面临着所描述的问题,这里有一个秘诀:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8133375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档