質問
ページネーションにこのコードを使用していますが、ユーザーの選択がサイト全体で持続するようにしたい(これはこれまでに解決されています)...唯一の問題は、セッション変数が永続的になったことですブラウザを閉じてセッションがクリアされるまで。また、diggスタイルのDjangoページのように、隣接するページを表示するにはどうすればよいですか。これをコードに実装する方法を理解できませんでした。
コードは次のとおりです。
from django.core.paginator import Paginator, InvalidPage, EmptyPage
def paginate(request, object_list, paginate_by=10):
try:
if "per_page" in request.session:
per_page = request.session["per_page"]
else:
request.session["per_page"] = int(request.REQUEST['p'])
per_page = request.session["per_page"]
request.session.set_expiry(0)
except:
per_page = 10
paginator = Paginator(object_list, per_page)
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
try:
items = paginator.page(page)
except (EmptyPage, InvalidPage):
items = paginator.page(paginator.num_pages)
return items
次に、テンプレートにページネーションリンクをレンダリングするためにこれがあります:
<div class="pagination" align="center">
<span class="step-links">
{% if items.has_previous %}
<a href="?page={{ items.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ items.number }} of {{ items.paginator.num_pages }}
</span>
{% if items.has_next %}
<a href="?page={{ items.next_page_number }}">next</a>
{% endif %}
</span>
</div>
解決
セッションを有効にすることでこれを達成できます。
セッション、ユーザー、および登録の章を読むことをお勧めしますdjangobook Webサイト。
編集:セッションを有効にしたので、問題はテンプレート内のハイパーリンクだと思います。アンパーサンドを使用して、URL内の複数のパラメーターを区切ります。たとえば、
<a href="?p={{ request.session.per_page }}&page={{ items.next_page_number }}">next</a>
編集2:セッションの有効期限に関する問題を理解しているかどうかわかりません。ブラウザが閉じたときにセッションが期限切れになるように設定する行は、 request.session.set_expiry(0)
です。 ビューでのセッションの使用に関するdjangoのドキュメントを参照してください。 変更する場合。
Diggスタイルのページネータを作成するには、現在のページ番号とページの総数を取得し、ページ番号のリストを返す関数を作成する必要があります。次に、テンプレートでページ番号をループし、ページへのリンクを作成します。
ページ番号のリストのリストにより、ページ番号をグループに分割できます。例:
[[1,2]、[20,21,22,23,24]、[30,31]]