Проблема с пагинацией

Я использую этот код для своей разбивки на страницы, и я хотел бы, чтобы выбор пользователя был постоянным на всем сайте (до сих пор это было решено)... единственная проблема сейчас заключается в том, что переменная сеанса теперь постоянна до сеанса очищается закрытием браузера. Кроме того, как я могу отобразить соседние страницы... как в пагинаторе Django в стиле digg. Я не смог понять, как реализовать это в моем коде.

Код выглядит следующим образом:

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>

person Stephen    schedule 27.11.2009    source источник


Ответы (1)


Вы можете добиться этого, включив сеансы.

Я рекомендую прочитать главу Сеансы, пользователи и регистрация на веб-сайте djangobook.


Изменить: теперь, когда вы включили сеансы, я думаю, что проблема заключается в гиперссылках в шаблоне. Используйте амперсанд для разделения нескольких параметров в 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]]

person Alasdair    schedule 27.11.2009
comment
тоже так думал...просто хотел узнать нет ли других способов - person Stephen; 27.11.2009
comment
Я пробовал приведенный выше код, но, должно быть, что-то не так... теперь разбиение на страницы не работает (кроме первой страницы)... что я пропустил или упустил - person Stephen; 27.11.2009
comment
Я не могу сейчас смотреть на ваш код. Если вы пометите вопрос как неотвеченный (щелкните зеленую галочку) и отредактируете свой вопрос, объяснив, что вы пытались сделать, он, вероятно, привлечет больше внимания других людей. - person Alasdair; 27.11.2009
comment
к сожалению, это все то же самое .... вторая страница никогда не отображается. Сайт всегда на первой странице несмотря ни на что - person Stephen; 28.11.2009
comment
только что решил это....удаление ?p={{ request.session.per_page }}& отлично работает...значение для p все равно будет установлено в нумерации страниц через сеанс - person Stephen; 28.11.2009
comment
Я немного обновил свой вопрос... посмотри на него и дай мне знать - person Stephen; 28.11.2009