Django のページネーションと「現在のページ」
-
09-09-2019 - |
質問
私は現在、悪名高い「ページネーション」テクニックを利用する Django アプリケーションを開発しています。django.core.paginator モジュールがどのように機能するかを理解しようとしています。
Question モデルを含むアプリケーションがあります。このページネーターを使用してすべての質問をリストします。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 つあります。
- Django に質問がどのページにあるのかを認識させるにはどうすればよいですか?
- 現在アクセスしているページを適切に「強調表示」するには、テンプレートをどのように作成すればよいでしょうか?
編集:申し訳ありませんが、この質問の一部を忘れていました。また、現在のページ以外の任意のページにリンクしてほしいです。 /questions/{{ that_page.start_index }}
. 。したがって、基本的にすべてのページのリンクは、そのページの最初の質問にリンクします。
解決
は、うーん...私はあなたが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 %}
の項目については、あなたがで動作するように二つの異なるobject_listsを持っています...
page.object_list
現在のページ内のオブジェクトとなり、
page.paginator.object_list
は関係なく、ページのすべてのオブジェクトになります。これらの項目のそれぞれは、彼らがにしているどのページを教えてくれる「ページ」変数を持つことになります。
すべての言った、あなたは型破りな音を何をやっていること。あなたは再考したいのですが、いずれにせよ、幸運があります。
他のヒント
ジャンゴ、少なくともに、私たちはこれを完了することができます純粋デフォルトページネーションのテンプレートタグを使用してタスク。
{% 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)
ジャンゴ - ページネーション何をしたいとあなただけのプラグインして使用することができますきれいなパッケージに包まれています。それは本質的にテンプレートやミドルウェアへのご意見からコードを移動します。
編集:私はちょうどあなたの編集を見ました。
あなたは、任意のページのために、現在のオブジェクトと{% 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
ということで、あなたが必要なすべてを行うことができるはず。 カップル良い例がここにのあります。