【问题标题】:Use django-pagination to generate link refl=next/prev使用 django-pagination 生成链接 refl=next/prev
【发布时间】:2011-11-15 08:24:14
【问题描述】:

我正在使用django-pagination 对我的页面进行分页。效果很好,但我想设置

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

&lt;head&gt;,就像是recommended by google

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

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

这当然不起作用(pagination.html 包含在{% paginate %} 标记中,它不会扩展我的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 %} 范围内可用。 A 可以调用

{% autopaginate object_list %}

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

编辑:我使用的是 django 1.2。

【问题讨论】:

    标签: django django-pagination


    【解决方案1】:

    您可以在更高级别的块中执行{% 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 的下一个版本中中断,它们也很微妙,可能会被其他开发人员意外破坏。

    【讨论】:

    • 我已经尝试过了,但是当我将 {% autopaginate my_list %} 从所有块中移出时,例如。直接在 {% extends %} 和 {% load pagination_tags %} 之后,分页失败(渲染所有项目,不进行分页)。
    • 也许 django-pagination 自从我上次使用它以来已经更新,所以这个方法不再有效......
    • 这可能是由于我使用的 django 版本造成的吗? (1.2)我对Django的熟练程度不高,能够轻松阅读源代码并说出问题所在。
    • 对不起,实际上autopaginate 从来没有像我描述的那样工作过。您只能在更高级别的块中使用它,但它不能在非块中使用。我已经更新了我的答案。但也请在回答结束时简明我的道德,如果您有时间,请做正确的事。
    • 我同意你的道德说明,这看起来更像是view 的工作。但是 django-pagination 不允许任何其他方法。你会推荐什么来代替它?在我看来,我使用一些过滤器来缩小结果集,然后我想在模板中显示它,分页。我想使用尽可能少的代码,因为它将在多个视图中使用。
    【解决方案2】:

    我们可以在视图中调用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多