16

私は現在、悪名高い「ページネーション」技術を利用する Django アプリケーションを開発しています。django.core.paginator モジュールがどのように機能するかを理解しようとしています。

質問モデルを使用したアプリケーションがあります。このページネーターを使用してすべての質問をリストします。1ページに20問出題されます。

def show_question(question_pk):
    questions = Question.objects.all()
    paginator = Paginator(questions, 20)
    page      = ... # Somehow figure out which page the question is on
    return render_to_response('show_question.html', { 'page' : page })

さまざまなページを「... 2、3、4、5、6、...」としてリストするビューでは、多くのページと同様に、現在のページを何らかの方法で強調表示したいと考えています。

本当に知りたいことが2つあります。

  1. 質問がどのページにあるかをDjangoに理解させるにはどうすればよいですか?
  2. 現在アクセスしているページを適切に「ハイライト」するには、テンプレートをどのように作成すればよいですか?

編集:申し訳ありませんが、この質問の一部を忘れていました。また、現在のページ以外のすべてのページを へのリンクにしたいと考えてい/questions/{{ that_page.start_index }}ます。したがって、基本的にすべてのページ リンクは、そのページの最初の質問にリンクします。

4

3 に答える 3

12

うーん...あなたのコメントから、django.core.paginatorが使用するために書かれた古いGETパラメーターを実行したくないことがわかります。あなたが望むことを行うには、各質問が掲載されているページを事前に計算する以外に良い方法はないと思います。例として、ビューは次のようになります。

ITEMS_PER_PAGE = 20
def show_question(question_pk):
    questions = Question.objects.all()
    for index, question in enumerate(questions):
        question.page = ((index - 1) / ITEMS_PER_PAGE) + 1
    paginator = Paginator(questions, ITEMS_PER_PAGE)
    page = paginator.page(questions.get(pk=question_pk).page)
    return render_to_response('show_question.html', { 'page' : page })

テンプレートで現在のページを強調表示するには、次のようにします。

{% for i in page.paginator.page_range %}
    {% ifequal i page.number %}
        <!-- Do something special for this page -->
    {% else %}
        <!-- All the other pages -->
    {% endifequal %}
{% endfor %}

アイテムに関しては、2 つの異なる object_lists を操作する必要があります...

page.object_list

現在のページのオブジェクトになり、

page.paginator.object_list

ページに関係なく、すべてのオブジェクトになります。これらの各項目には、それらがどのページにあるかを示す「ページ」変数があります。

とはいえ、あなたがしていることは型にはまらないように聞こえます。考え直したくなるかもしれませんが、いずれにせよ、幸運を祈ります。

于 2009-04-15T00:24:23.230 に答える
11

少なくともバージョン 1.2 以降のDjango では、純粋なデフォルトのページネーション テンプレート タグを使用してこのタスクを完了できます。

{% for page in article_list.paginator.page_range %}
  {% if page == article_list.number %}
    {{ page }}
  {% else %}
    <a href="/page{{ page }}">{{ page }}</a>
  {% endif %}
{% endfor %}

article_list のインスタンス

paginator = Paginator(article_list, 20)
    try:
        article_list = paginator.page(int(page))
    except (EmptyPage, InvalidPage):
        article_list = paginator.page(paginator.num_pages)
于 2010-11-08T16:19:46.683 に答える
5

django-paginationは、あなたが望むことを行うべきであり、プラグインして使用できるきれいなパッケージに包まれています。基本的に、コードをビューからテンプレートとミドルウェアに移動します。

編集:あなたの編集を見ました。を使用して、ページ上の現在のオブジェクトを取得できます。これは、特定のページの現在のオブジェクトに{% autopaginate object_list %}置き換えobject_listられます。それを繰り返すことができ、最初が必要な場合は、それをリストのように扱ってobject_list[0].

これをビュー内に保持したい場合は、次のようにすることができます。

def show_question(question_pk):
    questions = Question.objects.all()
    paginator = Paginator(questions, 20)
    return render_to_response('show_question.html', { 'page' : paginator })

テンプレート内で、次のようにして、現在表示しているページにアクセスできます。

# Gives you the starting index for that page.
# For example, 5 objects, and you're on the second page. 
# start_index will be 3.
page.start_index

# You can access the current page number with:
# 1-based index
page.number

これで、必要なことはすべてできるはずです。ここにいくつかの良い例があります。

于 2009-04-14T14:06:35.757 に答える