2015-05-30 2 views
6

Я использую код из документации к постраничным данным:пейджинга в Джанго - исходная строка запроса потеряется

try: 
    data = paginator.page(request.GET.get('page')) 
except PageNotAnInteger: 
    page = 1 
    data = paginator.page(1) 
except EmptyPage: 
    data = paginator.page(paginator.num_pages) 

и страница:

<div class="pagination"> 
     <span class="step-links"> 
      {% if data.has_previous %} 
       <a href="?page={{ data.previous_page_number }}">previous</a> 
      {% endif %} 

      <span class="current"> 
       <b>Page</b> {{ data.number }} of {{ data.paginator.num_pages }} 
      </span> 

      {% if data.has_next %} 
       <a href="?page={{ data.next_page_number }}">next</a> 
      {% endif %} 

     </span> 
    </div> 

Но есть ошибка здесь: когда url содержит строку запроса и один щелчок на Pager, исходная строка запроса теряется. Например:

example.com?var1=33&var2=44 

, а затем, когда один нажимает на "page2", URL-адрес становится

example.com?page=2 # var1=33&var2=44 is lost 

вместо:

example.com?var1=33&var2=44&page=2 

я не нашел ни стандарта, ни простой способ его исправить. Как я могу это сделать?

UPDATE:

конечно, имена параметров, их значения и ли они существуют или нет, не известно.

+0

Я использовал один из двух простых решений, упомянутых [здесь] (https://simpleisbetterthancomplex.com/snippet/2016 /08/22/dealing-with-querystring-parameters.html). Кроме того, важно отметить, что решение javascript (как предлагается в нескольких сообщениях SO) может работать здесь, но может повлиять на SEO, поскольку ссылки на страницы не будут настоящими URL-адресами в этом случае – Anupam

ответ

7

Вы можете получить доступ к параметрам из вашего запроса непосредственно в своем шаблоне, если вы активируете django.core.context_processors.request в своих настройках. См. https://docs.djangoproject.com/en/1.7/ref/templates/api/#django-core-context-processors-request

Затем вы можете напрямую получить доступ к параметрам в своем шаблоне. В вашем случае вам нужно будет отфильтровать параметр page. Вы могли бы сделать что-то вроде этого:

href="?page={{ data.next_page_number }}{% for key, value in request.GET.items %}{% if key != 'page' %}&{{ key }}={{ value }}{% endif %}{% endfor %}" 
+0

Посмотрите мое обновление –

+0

Этот подход должен работать с неизвестными параметрами –

+0

Позвольте мне проверить ... –

0

Самый простой способ будет включать эти переменные в шаблоне:

<a href="?var1={{var1}}&var2={{var2}}&page={{ data.next_page_number }}">next</a> 

Просто добавьте var1 и var2 к вашему context.

Это, если переменные строки запроса возникли из вашего бэкэнд. Если они поступают из внешнего/внешнего, вы можете использовать что-то вроде How can I get query string values in JavaScript? в своем шаблоне и либо напрямую редактировать шаблоны, либо передавать значения на ваш сервер.

+0

Посмотрите мое обновление –

3

Другим возможным решением может быть создание списка параметров в вашем представлении. Плюсы: вы можете использовать чистые и выразительные методы на QueryDict.

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

get_copy = request.GET.copy() 
parameters = get_copy.pop('page', True) and get_copy.urlencode() 
context['parameters'] = parameters 

Вот оно! Теперь вы можете использовать context переменные в шаблоне:

href="?page={{ paginator.next_page_number }}&{{ parameters }}" 

Престол, код выглядит чистым и красиво.

Примечание: предполагается, что контекст, содержащийся в context Dict и ваш Paginator в paginator переменной

Смежные вопросы