2009-04-14 9 views
9

私は現在、悪名高い "ページネーション"テクニックを利用するDjangoアプリケーションを開発中です。私はdjango.core.paginatorモジュールの仕組みを理解しようとしています。Djangoページネーションと "現在のページ"

私は質問モデルでアプリケーションを持っています。私はこのページャーを使用してすべての質問をリストアップします。ページあたり20の質問があります。

私は多くのページのように、何らかの形で現在のページを強調したい "... 2、3、4 、5、6、..." と私は別のページをリストビューで
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 }) 

、行う。私が知りたい二つのことが本当にあります

  1. どのように私は、Djangoは質問がで配置されているページを見つけ出す作るのですか?
  2. テンプレートを書き込んで、現在訪問しているページを適切に「強調表示」するにはどうすればよいですか?

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

+0

のインスタンスどのようなあなたは、現在を除くすべてのページは、そのページ上の質問にリンクする意味ですか?ユーザーはどのようにページを変更しますか? –

+0

私はpage = 4 GETリクエストパラメータなどを渡したくありません。私は質問4の/ question/4のみを使用し、そのページがどのページに表示されているかを調べます。これがページリンクが実際に質問に向けられている理由です。 –

+0

多くの質問が追加されるか、ソートされる可能性があるため、ページの変更に関する最初の質問はありませんか? REST/HTTPの観点からは、URLが実際のリソースを参照していないことを意味します。このため、DjangoはGETパラメータを使用します.URLが識別するリソースの表示特性に注釈を付けるためです。 –

答えて

7

うーん...私はあなたが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 }) 

、あなたが'LL、項目については

{% 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 

は関係なく、ページのすべてのオブジェクトになります。これらの各アイテムには、どのページが表示されているかを示す「ページ」変数があります。

あなたがしていることはすべて、慣習的ではないと言われています。あなたは、どちらにせよ、幸運を考え直すことをお勧めします。

+0

ああ男の子、ああ男の子! 'page.paginator.object_list [i] .page'はおそらくまさに私が探していたものですね!私はすぐにそれをチェックします。ありがとう! –

5

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

編集:私はあなたの編集を見ました。 {% autopaginate 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 

これで、必要なものすべてを実行できるはずです。 良い例がいくつかありますhereです。

+0

ご意見ありがとうございます。しかし、私にとっては、ジャンゴページネーションは組み込みのページングのものだけではなく、ロジックをコードからテンプレートとミドルウェアに移すだけです。そうですか? –

+0

本質的に、はい。ビュー内にページネーションログインを維持したい場合は、私の回答を更新しました。 –

10

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

{% 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) 
+0

+1すばらしい...ページオーバーのようなstackoverflowを書くことは可能ですか(つまり、 'prev 1 ... 7 8 9 10 11 ... 500435 next')。私は '...'を意味します – suhailvs

+0

@suhail、はいそれは可能ですが、テンプレートを変更するだけです([django template syntax](https://docs.djangoproject.com/ja/dev/ref/templates/builtins) /)。しかし、むしろ[django-endless-pagination](http://django-endless-pagination.readthedocs.org/en/latest/)アプリを試してみることをお勧めします。設定は簡単で、あらゆる種類のページネーションスタイルに適切なデフォルトが設定されています。 –

関連する問題