Как разбить Django на другие переменные get? - PullRequest
61 голосов
/ 12 января 2010

У меня проблемы с использованием нумерации страниц в Django . Возьмите приведенный ниже URL в качестве примера:

http://127.0.0.1:8000/users/?sort=first_name

На этой странице я сортирую список пользователей по их имени. Без переменной GET сортировки по умолчанию производится сортировка по id.

Теперь, если я нажму следующую ссылку, я ожидаю следующий URL:

http://127.0.0.1:8000/users/?sort=first_name&page=2

Вместо этого я теряю все переменные get и получаю

http://127.0.0.1:8000/users/?page=2

Это проблема, потому что вторая страница сортируется по идентификатору вместо first_name.

Если я использую request.get_full_path, я в конечном итоге получу ужасный URL:

http://127.0.0.1:8000/users/?sort=first_name&page=2&page=3&page=4

Какое решение? Есть ли способ получить доступ к переменным GET в шаблоне и заменить значение для страницы?

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

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

Ответы [ 15 ]

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 %}

Источник

0 голосов
/ 09 марта 2014

Вам нужно будет вернуть GET, как указано выше. Вы можете передать часть запроса GET, набрав

render_dict['GET'] = request.GET.urlencode(True)
return render_to_response('search/search.html',
                          render_dict,
                          context_instance=RequestContext(request))

затем вы можете использовать это в шаблоне для создания вашего URL, например

href="/search/client/{{ page.no }}/10/?{{ GET }}
0 голосов
/ 05 августа 2013

Я бы сказал, сгенерируйте следующую и предыдущую ссылку из вашего контроллера, затем передайте ее представлению и используйте ее оттуда. Я приведу вам пример (больше похожий на псевдокод):

("next_link", "?param1="+param1+"&param2="+param2+"&page_nr="+(Integer.parseInt(page_nr)-1)

тогда, на ваш взгляд, используйте это так:

{% if contacts.has_next %}
<a href="?page={{ contacts.next_link }}">next</a>
{% endif %}
0 голосов
/ 04 апреля 2013

'путь': request.get_full_path (). Rsplit ('& page') [0],

0 голосов
/ 12 января 2010

Каждая указанная вами ссылка должна быть снабжена соответствующими параметрами. Не существует неявной магии, которая конвертировала бы:

http://127.0.0.1:8000/users/?page=2

в

http://127.0.0.1:8000/users/?sort=first_name&page=2

Итак, вам нужен какой-то Sorter объект / класс / функция / фрагмент (любой, который может поместиться здесь без переутомления), который будет действовать аналогично django.core.paginator.Paginator, но будет обрабатывать параметр sort GET .

Это может быть так просто:

sort_order = request.GET.get('sort', 'default-criteria')

<paginate, sort>

return render_to_response('view.html', {
    'paginated_contacts': paginated_contacts,  # Paginator stuff
    'sort_order': sort_order if sort_oder != 'default-criteria' else ''
})

Тогда, на ваш взгляд:

{% if contacts.has_next %}
    <a href="?page={{ contacts.next_page_number }}{%if sort_order%}&sort={{sort_oder}}{%endif%}">next</a>
{% endif %}

Я мог бы стать более общим, но я надеюсь, что вы поняли концепцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...