Предоставление пользователю cookie, безусловно, будет работать. В веб-разработке этот метод известен как создание «сеанса» для пользователя, так что каждый раз, когда он запрашивает страницу с вашего сайта, запрос может быть идентифицирован как часть этого конкретного сеанса и соответственно обработан.
Django поставляется с отличной и очень простой в использовании сессионной структурой. Вы должны прочитать документацию здесь , но я кратко опишу шаги, которые вам нужно предпринять.
- Включить промежуточное программное обеспечение сеансов Django (это уже сделано в проекте Django по умолчанию). Убедитесь, что
django.contrib.sessions.middleware.SessionMiddleware
находится в вашей переменной MIDDLEWARE_CLASSES
в файле настроек.
- Выберите сессионный бэкэнд. Для начала сеансы базы данных будут работать достаточно хорошо (если производительность станет проблемой позже, рассмотрим кэшированные сеансы с Memcached, предоставляющим хранилище).
- Установите соответствующий
SESSION_COOKIE_AGE
, который соответствует вашим требованиям. Вы можете установить это число очень высоким, если хотите, чтобы выбор пользователей продолжался в течение длительного времени.
Как только вы это сделаете, переменная request
, передаваемая в ваши представления, будет иметь атрибут session
. session
- это объект, который вы можете использовать как словарь для хранения информации. Волшебство в том, что эта информация будет уникальной для каждого пользователя, который делает запросы на ваш сайт.
Этот частичный код демонстрирует, как вернуть контент на основе ранее выбранного пользователем выбора, сохраненного в их сеансе:
def get_front_page_contents(request):
filter = request.session.get('filter_choice', False)
if filter:
# do the filtering
render_to_response(template_name,
{'filtered_content': content},
RequestContext(request))
else:
# the user has not made a choice so
# return a default result set or redirect
# to form that allows them to make a choice
Ваш второй вопрос был о том, как собрать этот выбор в первую очередь. Вот простое решение, которое использует несколько загрузок страниц.
- При первоначальном запросе на домашнюю страницу, проверьте, есть ли у
request.session
выбор, сохраненный для этого пользователя.
- Если это так, создайте страницу с фильтрованным содержимым (и все готово).
- Если нет, перенаправьте на форму, где они могут сделать выбор.
- При отправке формы сохраните выбор в
request.session
для этого пользователя. Верните желаемый контент.
После этого процесса, когда один и тот же пользователь вернется к шагу один позднее, будет отображаться его желаемое содержимое.
Избегание перезагрузки страницы - отдельная проблема, но это легко сделать с помощью методов javascript и AJAX. Вы, вероятно, захотите разместить минимальную страницу, которая включает в себя javascript для выполнения запросов на контент. Эти AJAX-запросы могут быть точно таким же образом проверены на наличие данных сеанса.