Django - разбиение на страницы в шаблоне с использованием нескольких параметров GET - PullRequest
4 голосов
/ 05 декабря 2011

Я использую Django Paginator и хочу иметь несколько доступных параметров get, таких как: page = 1 sort_by = price

Однако в тегах моего шаблона у меня есть:

Showing items sorted by {{ SORT_PARAM }}.
Showing {{ ITEMS_PER_PAGE }} items per page.

{% if has_prev %}
<a href="?page={{ prev_page }}">Previous</a> |
{% endif %}

Однако это не сохраняет другие переменные GET.Я имею в виду, что если я просматриваю

page/?page=1&sort_by=price

и нажимаю на ссылку во фрагменте шаблона выше, я перейду к

page=2

вместо

page=2&sort_by=price

Я имею в виду, что href не сохраняет другие параметры GET.

Одним из решений является то, что я мог бы ввести все возможные параметры GET в a href, например

<a href="?page={{ prev_page }}&items_per_page={{ ITEMS_PER_PAGE }}&sort_param={{ SORT_PARAM }}">Previous</a>

но это станет менее масштабируемым, чем больше аргументов я хочу добавить в свой просмотр.Я предполагаю, что должен быть автоматизированный способ получить все параметры GET, а затем передать эти и еще один?

Ответы [ 3 ]

4 голосов
/ 01 мая 2012

Этот http://djangosnippets.org/snippets/1592/ выглядит чище

2 голосов
/ 05 декабря 2011

Вы можете создать «строку параметров».Предположим, что в вашем коде у вас есть:

my_view( request, page, options):
    sort_choices = {P:'price',N:'name', ...}
    n_item_choices = {'S':5, 'L':50, 'XL':100)
    ascending_descending_choices = {'A':'', 'D':'-'}
    ...

, тогда вы можете объединить параметры в виде:

options='P-S-D'  #order by price, 5 items per page, descending order

кодировать опционы как:

<a href="?page={{ prev_page }}&options={{ options }}">Previous</a>

затем, вПараметры захвата urls.py и в представлении:

my_view( request, page, options):
   ... #choides ....
   try:
      optionsArray = options.split('-')
      sort_by = sort_choices[ optionsArray[0]  ]
      n_ites_page = n_item_choices[ optionsArray[1]  ]
      asc_or_desc = ascending_descending_choices[ optionsArray[2]  ]
      ...
   except:
      somebody is playing ....

с помощью этого метода вы можете добавить дополнительные параметры разбивки на страницы без изменения urls.py, все, что вам нужно, это добавить параметры в конце параметров строки.Это имеет свои преимущества, но также и некоторые опасности: надеюсь, вы сможете определить риски.

0 голосов
/ 17 марта 2016

С Django's Pagination - сохранение параметров GET просто.

Сначала скопируйте параметры GET в переменную (в поле зрения):

GET_params = request.GET.copy()

и отправить его в шаблон через контекстный словарь:

return render_to_response(template,
                        {'request': request, 'contact': contact, 'GET_params':GET_params}, context_instance=RequestContext(request))

Второе, что вам нужно сделать, это использовать его, указав его в URL-вызовах (href) в шаблоне - пример (расширение базового html-нумерации страниц для обработки дополнительного условия параметра):

{% if contacts.has_next %}
    {% if GET_params %}
        <a href="?{{GET_params.urlencode}}&amp;page={{ contacts.next_page_number }}">next</a>
    {% else %}
        <a href="?page={{ contacts.next_page_number }}">next</a>
    {% endif %}
{% endif %}

Источник - Написал тот же ответ.

...