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>ているように。

ただし、これを行う方法が見つかりませんでした(少なくとも追加のクエリなしで)。pagination/templates/pagination.htmlまず、このようなもので編集しようとしました

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

もちろん、これは機能しませんでした (pagination.html は{% paginate %}タグに含まれており、 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 %}。Aはコールできます

{% autopaginate object_list %}

ブロックでextra_head、しかしそれはデータベースへの余分なヒットを意味します(そしておそらく私が気付いていない他の副作用)。これを解決するエレガントな方法はありますか?理想的にはできるだけDRYですか?

編集: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 -->

ここで、頭の中で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の次のリリースで機能しなくなる可能性があります。また、微妙であり、他の開発者によって誤って機能しなくなる可能性があります。

于 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 に答える