15

私はほとんどの部分でページネーションモジュールを機能させていますが、1つの問題があります。利用可能なページの一部のみを表示するにはどうすればよいですか。たとえば、nページのうち5ページにいるとしましょう。表示したいと思います。

1,2,3,4,5,6 ....(n-1)(n)。

Rubyには、これを実現するための素晴らしいフロントエンドの魔法があると思います。djangoモジュール内でできることはありますか?

他のサイトを見ると、基本的には論理が進んでいるように見えますが、固定数のスポットを選びます。その数が現在表示されている量よりも大きい場合は、ユーザーがページを進むときにアイテムを追加します。その数のスポットに達したら、現在のページの左右にx個のスポットのみを表示します。

それを実現するために、独自のテンプレートロジックを作成する必要がありますか?

ありがとう

4

4 に答える 4

11

djangoで求めているものを実装することについてのかなりの数の素晴らしい記事。自分で作成したくない場合は、カスタマイズできるプラグイン可能なパッケージがたくさんあります。

http://www.tummy.com/Community/Articles/django-pagination/

https://github.com/dcramer/django-paging

組み込みのページネーターをラップする非常に優れたドキュメントスニペット:

http://blog.elsdoerfer.name/2008/03/06/yet-another-paginator-digg-style/

于 2011-03-25T02:30:50.010 に答える
7

DjangoSnippetsの「DiggのようなPaginator」を使用してこれを実装しました。

これは間違いなくあなたが探しているものです。

そのコードをPythonモジュールにダンプしてdigg_paginator.pyインポートするだけです...

from django.core.paginator import InvalidPage, EmptyPage #, Paginator
from digg_paginator import DiggPaginator as Paginator

それから私のテンプレートで私はから切り替える必要がありました...

{% for page_num in page.paginator.page_range %}

{% for page_num in page.page_range %}

それでおしまい!はDiggPaginator、Djangoに組み込まれているものとまったく同じインターフェイスに加えていくつかの機能を備えているため、必要に応じて、適切な場所にドロップして、いくつかのカスタマイズで調整できます。

于 2011-03-25T18:48:23.663 に答える
2

私は最近、自分のサイトWantbox.comに対してまったく同じことをしなければならず、非常にシンプルで効果的な解決策を見つけました。

このスニペットを、アプリの「templatetags」ディレクトリの「paginator.py」というファイルに追加します。

#  Based on: http://www.djangosnippets.org/snippets/73/
#
#  Modified by Sean Reifschneider to be smarter about surrounding page
#  link context.  For usage documentation see:
#
#     http://www.tummy.com/Community/Articles/django-pagination/

from django import template

register = template.Library()

def paginator(context, adjacent_pages=2):
    """
    To be used in conjunction with the object_list generic view.

    Adds pagination context variables for use in displaying first, adjacent and
    last page links in addition to those created by the object_list generic
    view.

    """
    startPage = max(context['page'] - adjacent_pages, 1)
    if startPage <= 3: startPage = 1
    endPage = context['page'] + adjacent_pages + 1
    if endPage >= context['pages'] - 1: endPage = context['pages'] + 1
    page_numbers = [n for n in range(startPage, endPage) \
            if n > 0 and n <= context['pages']]
    page_obj = context['page_obj']
    paginator = context['paginator']

    return {
        'page_obj': page_obj,
        'paginator': paginator,
        'hits': context['hits'],
        'results_per_page': context['results_per_page'],
        'page': context['page'],
        'pages': context['pages'],
        'page_numbers': page_numbers,
        'next': context['next'],
        'previous': context['previous'],
        'has_next': context['has_next'],
        'has_previous': context['has_previous'],
        'show_first': 1 not in page_numbers,
        'show_last': context['pages'] not in page_numbers,
    }

register.inclusion_tag('paginator.html', takes_context=True)(paginator)

次に、これをページネーションが必要なページに追加します。

<div>{% if is_paginated %}{% load paginator %}{% paginator 3 %}{% endif %}</div>

「3」を「2」または「4」に変更すると、ページネーションの切り捨て方法が変更されます。私のサイト(ページの右上)で例を見ることができます。

于 2011-03-25T04:48:51.740 に答える
0

ListViewを使用している場合、これがページネーター関数です。

def paginator(context, adjacent_pages=2):
    """
    To be used in conjunction with the object_list generic view.

    Adds pagination context variables for use in displaying first, adjacent and
    last page links in addition to those created by the object_list generic
    view.

    """
    startPage = max(context['page_obj'].number - adjacent_pages, 1)
    if startPage <= 3: startPage = 1
    endPage = context['page_obj'].number + adjacent_pages + 1
    if endPage >= context['paginator'].num_pages - 1: endPage = context['paginator'].num_pages + 1
    page_numbers = [n for n in range(startPage, endPage) \
            if n > 0 and n <= context['paginator'].num_pages]
    page_obj = context['page_obj']
    paginator = context['paginator']

    return {
        'page_obj': page_obj,
        'paginator': paginator,
        'page': context['page_obj'].number,
        'pages': context['paginator'].num_pages,
        'page_numbers': page_numbers,
        'next': context['page_obj'].next_page_number,
        'previous': context['page_obj'].previous_page_number,
        'has_next': context['page_obj'].has_next,
        'has_previous': context['page_obj'].has_previous,
        'show_first': 1 not in page_numbers,
        'show_last': context['paginator'].num_pages not in page_numbers,
    }

私のテンプレート

    <nav>
        <ul class="pagination">
            <li{% if not page_obj.has_previous %} class="disabled"{% endif %}>
                <a {% if page_obj.has_previous %} href="?{{ path }}page={{ page_obj.previous_page_number }}"{% endif %}><i
                        class="fa fa-angle-left"></i></a>
            </li>
            {% if show_first %}
                <li><a href="?{{ path }}page=1">1</a></li>
                <li class="disabled"><a>&hellip;</a></li>
            {% endif %}
            {% for linkpage in page_numbers %}
                {% ifequal linkpage page %}
                    <li class="active"><a>{{ page }}</a></li>
                {% else %}
                    <li><a href="?{{ path }}page={{ linkpage }}">{{ linkpage }}</a></li>
                {% endifequal %}
            {% endfor %}
            {% if show_last %}
                <li class="disabled"><a>&hellip;</a></li>
                <li><a href="?{{ path }}page=last">{{ pages }}</a></li>
            {% endif %}
            <li{% if not page_obj.has_next %} class="disabled"{% endif %}>
                <a {% if page_obj.has_next %}  href="?{{ path }}page={{ page_obj.next_page_number }}"{% endif %}><i
                        class="fa fa-angle-right"></i></a>
            </li>
        </ul>
</nav>
于 2017-09-27T10:44:04.390 に答える