Разбиение на страницы результатов Django формирует запрос POST

Я использую Django Forms, чтобы сделать фильтрованный/фасетный поиск по почте, и я хотел бы к paginator классу Django организовать результаты. Как я сохраняю исходный запрос при передаче клиента между различными страницами? Другими словами, кажется, что я теряю данные POST, как только я передаю ПОЛУЧИТЬ запрос на другую страницу назад к моим представлениям. Я видел некоторые рекомендации использовать Ajax для обновления только блока результатов страницы, но я задаюсь вопросом, существует ли Django-собственный механизм для того, чтобы сделать это.

Спасибо.

18
задан andyashton 15 February 2010 в 14:31
поделиться

3 ответа

Если вы хотите получить доступ к данным магазина в более позднем запросе, вам нужно будет где-то их сохранить. Django предоставляет несколько способов заархивировать это:

1) Вы можете использовать sessions для хранения запроса: Каждый посетитель, который посещает ваш сайт, получит пустой объект сеанса, и вы можете сохранить все, что захотите. внутри этого объекта, который действует как диктатор. Недостаток: один посетитель не может одновременно выполнять несколько поисков с разбивкой на страницы.

2) Использовать файлы cookie: Если вы установите файл cookie, который хранится на стороне клиента, браузер будет добавлять данные файла cookie в каждый запрос, где вы можете получить к нему доступ. Файлы cookie более удобны для сервера, поскольку вам не нужен диспетчер сеансов для них на сервере, но данные, хранящиеся в файлах cookie, видны (и доступны для редактирования) клиенту. Недостаток: такой же, как и раньше.

3) Использовать скрытые поля: Вы можете добавить форму с некоторыми скрытыми полями на страницу результатов поиска и сохранить в них запрос. Затем клиент будет повторно отправлять запрос всякий раз, когда вы отправляете форму. Недостаток: вы должны использовать форму с кнопками отправки для разбивки на страницы на вашей странице (простые ссылки не работают).

4) Создайте ссылки, содержащие запрос: Вместо использования POST вы также можете использовать GET. Например, у вас может быть ссылка типа «/ search / hello + world /? Order = voices» и «ссылки с разбивкой на страницы», например «/ search / hello + world / 2 /? Order- голосов ». Тогда запрос можно легко получить из URL-адреса. Недостаток: максимальный объем данных, который вы можете отправить через GET, ограничен (но это не должно быть проблемой для простого поиска).

5) Используйте комбинацию: Возможно, вы захотите сохранить все данные в сеансе или в базе данных и получить к ним доступ через сгенерированный ключ, который вы можете ввести в URL-адрес. Тогда URL-адреса могут выглядеть как « / search / 029af239ccd23 / 2» (для 2-й страницы), и вы можете использовать ключ для доступа к огромному количеству данных, которые вы сохранили ранее. Это устраняет недостаток решения 1, а также решения 4. Новый недостаток: много работы :)

6) Использование AJAX: С помощью ajax вы можете хранить данные внутри некоторых js-переменных на стороне клиента, который затем может быть передан другим запросам. А поскольку ajax обновляет только ваш список результатов, переменные не теряются.

25
ответ дан 30 November 2019 в 07:23
поделиться

Вы можете спросить объект запроса, если это ajax, просто request.is_ajax . Таким образом вы можете определить, является ли это первым запросом на публикацию или дополнительными вопросами о следующих страницах.

0
ответ дан 30 November 2019 в 07:23
поделиться

Сделать так, чтобы форма поиска и результаты отображались на одном шаблоне django. Первоначально используйте css, чтобы скрыть область отображения результатов. При POST форме вы можете проверить, вернулись ли результаты поиска, и скрыть форму поиска с помощью css, если результаты есть. Если результатов нет, используйте css для скрытия области отображения результатов, как и раньше. В ссылках пагинации используйте javascript для отправки формы, это может быть просто document.forms[0].submit(); return false;

Вам нужно будет решить, как передать номер страницы механизму пагинации django.

0
ответ дан 30 November 2019 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: