2

(これは、ページ ナビゲーションを作成しようとしたときに遭遇したこの根本的な問題に対して私が思いついた解決策を共有するものです)

これは非常に基本的なことのように思えますが、これに対する基本的な解決策を見つけるのが非常に困難だったとは信じられません。

テンプレートでページをナビゲーションとして表示する必要があるまでは、基本的にdjangoのページネーションはかなり良いです。次に、次のことを達成するために、わいせつなロジックを作成する必要があります

  • 現在のページ番号に隣接する x ページ番号を表示します。例: 前に 2 つ、後に 2 つ
  • 最初のページ番号をいつ表示するかを決定する
  • 最後のページ番号をいつ表示するかを決定する
  • 現在のページ番号を強調表示する
  • 必要に応じてこれをスタイルします

ページ数が少ない場合はデフォルトのページネーションで問題ありませんが、かなりの数になるとすぐに上記の要件を満たすことが難しくなります。

django 1.5+で動作するように見つけて修正したソリューションを投稿しました。このトピックに関して共有できる他の解決策がある場合は、ぜひご覧ください。ありがとう

4

2 に答える 2

1

Django は、テンプレートで paginator オブジェクトを使用するための基本を提供します。

{% for contact in contacts %}
    {# Each "contact" is a Contact model object. #}
    {{ contact.full_name|upper }}<br />
    ...
{% endfor %}

<div class="pagination">
    <span class="step-links">
        {% if contacts.has_previous %}
            <a href="?page={{ contacts.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ contacts.number }} of {{ contacts.paginator.num_pages }}.
        </span>

        {% if contacts.has_next %}
            <a href="?page={{ contacts.next_page_number }}">next</a>
        {% endif %}
    </span>
</div>

これがタグにまとめられていない理由は、おそらく、django が特定のスタイル/ライブラリを強制したくないためです (jquery は例外ですが、それもオプションです)。

ページネーションのスタイルをさらに決定することは、アプリケーションやビューポートとは異なる意見を持つことができます。ただし、この問題に取り組んでいる人は他にもたくさんいます。すぐに思いつくのはdjango-endless-pagination、 との 2 つですdjango-bootstrap-pagination

于 2014-08-26T06:51:43.933 に答える
1

実際には、django スニペットの周りにたくさんの答えが浮かんでいます。
この投稿に出くわしました: http://www.tummy.com/articles/django-pagination/

それは私が望んでいた最終結果をもたらしました。ジェネリック クラス ベースのビューで動作するように、または少なくとも同じコンテキスト変数が利用可能な場合に動作するように変更する必要がありました。

これは改善できると確信していますが、このままではかなり再利用できると思います。

  1. 最初に新しいアプリを作成します。例: my_pagination
  2. このアプリが設定で INSTALLED_APPS に追加されていることを確認してください
  3. このアプリ フォルダーに、templatetags と templates の 2 つのフォルダーを作成します。
  4. templatetags フォルダに paginator.py というファイルを作成します
  5. templates フォルダーに (この場合は my_pagination) というサブフォルダーを作成し、_paginator.html というファイルを追加します。(ファイル名の前にアンダースコアを付けるのは、含まれるテンプレート ファイルに対する私自身の規則です)

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/

# modified again by me to include target_url and work with django 1.7

from django import template
from django.core.paginator import InvalidPage

register = template.Library()

def paginator(context, adjacent_pages=2, target_url=None):
    """
    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']

    try:
        previous = context['page_obj'].previous_page_number()
    except InvalidPage:
        previous = None

    try:
        next = context['page_obj'].next_page_number()
    except InvalidPage:
        next = None


    return {
        'page_obj': page_obj,
        'paginator': paginator,
        'page': context['page_obj'].number,
        'page_numbers': page_numbers,
        'next': next,
        'previous': previous,
        'has_next': context['page_obj'].has_next(),
        'has_previous': context['page_obj'].has_previous(),
        'show_first': 1 not in page_numbers,
        # show last if the last page number is not in "page_numbers"
        'show_last': context['paginator'].num_pages not in page_numbers,
        'target_url' : target_url
    }

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

_paginator.htmlのコードは、ロジックを理解していれば何でもかまいません (これは非常に簡単です)。Foundation 5 と fontawesome を使用しているので、_paginator.html は次のようになります。

<ul class="pagination">
   {% if has_previous %}
   <li class="arrow"><a href="{{ target_url }}?page={{ previous }}" target="_parent"><i class="fa fa-angle-double-left fa-lg fa-fw"></i></a></li>
   {% else %}
   <li class="arrow unavailable"><i class="fa fa-angle-double-left fa-lg fa-fw"></i></li>
   {% endif %}

   {% if show_first %}
      <li><a href="{{ target_url }}?page=1" target="_parent">1</a></li>
      <li>...</li>
   {% endif %}

   {% for linkpage in page_numbers %}
      {% if linkpage == page %}
          <li class="current">{{ page }}</li>
      {% else %}
         <li><a href="{{ target_url }}?page={{ linkpage }}" target="_parent">{{ linkpage }}</a></li>
      {% endif %}
   {% endfor %}

  {% if show_last %}
      <li>...</li>
      <li><a href="{{ target_url }}?page={{ paginator.num_pages }}" target="_parent">{{ paginator.num_pages }}</a></li>
   {% endif %}
   {% if has_next %}
       <li class="arrow"><a href="{{ target_url }}?page={{ next }}" target="_parent"><i class="fa fa-angle-double-right fa-lg fa-fw"></i></a></li>
   {% else %}
      <li class="arrow unavailable"><i class="fa fa-angle-double-right fa-lg fa-fw"></i></li>
   {% endif %}
</ul>

使用方法: テンプレート ファイルで次のことを確認します。

{% load paginator %}

カスタム テンプレート タグをロードするには

次に、ページを表示したい場所で次のようにします。

{% paginator 3 %}


1. target_url は、iframe に関するいくつかの奇妙な要件のためです。このパラメータは空白のままにしておくことができます。
2.関連性がないように思われたため、元のパラメーターの多くを削除しました。

于 2014-08-26T06:54:14.483 に答える