У меня часто случается, что на новом ресурсе я теряюсь в море разных функций и настроек и, чтобы не упустить из виду что-то интересное, открываю/дублирую вкладку.
Это не всегда удобно, да и кнопка «назад» иногда срабатывает непредсказуемо, например, из-за истории push, или из-за того, что обработчик POST «сломался» на редиректе (не назло, а ради эксперимента).
Поэтому, чтобы не раздражать пользователя, я решил сделать последние страницы.
Рассказ об этом ниже под катом.
Вариант первый
Изначально я хотел реализовать эту функцию через Middleware, но столкнулся с проблемой: запомнить URL и поместить его в кеш — не проблема, а вот получить текущий заголовок страницы — это да.И я до сих пор считаю, что единственный правильный способ реализовать это — использовать промежуточное программное обеспечение.
Глупые решения: используйте процесс_ответ() и разобрать заголовок; используйте ajax-скрипт на стороне клиента и все подобное, чтобы получить заголовок.
Поэтому нужно как-то добраться до шаблонизатора из мидлвара и получить там рут {% заголовок блока %} .
Буду рад, если вы поделитесь своим мнением по этому поводу.
Вариант второй
Используйте тег шаблона.
Я именно так и сделал, но существенный минус этого варианта в том, что шаблоны нужно редактировать вручную, либо думать, как встроить этот тег в base.html.
Вариант третий
Используйте ajax-скрипт типа трекера статистики.Преимущество этого варианта в том, что результаты можно использовать для различных нужд, например, для статистики.
Минусы: дополнительный скрипт, дополнительные обработчики, дополнительные данные.
Тег для сохранения заголовка Если вы используете ajax-запросы к одним и тем же представлениям, то стоит добавить проверку request.is_ajax() , чтобы не сохранять для пользователя неработающие ссылки.
Использование:@register.simple_tag(takes_context=True, name='save_visited') def save_visited(context, title, **kwargs): request = context['request'] # store last five pages identify_by = get_user_identification(request) visited_pages = cache.get('visited_pages_%s' % identify_by, [])[:4] # context.use_tz - why None if set True in settings? # may be we should save datetime.now() and convert it in getter? now = timezone.now() bundle = force_unicode(title), request.get_full_path()[:255], now visited_pages.insert(0, bundle) cache.set('visited_pages_%s' % identify_by, visited_pages, 60*60*24) return title
{% extends 'forum/themes/default/edit_profile.html' %}
{% load last_visited i18n %}
{% block title %}{% save_visited _("Profile setup") %}{% endblock %}
Получатель тегов, выгружает список в указанную переменную контекста.
@register.simple_tag(takes_context=True, name='load_visited')
def load_visited(context, variable, **kwargs):
identify_by = get_user_identification(context['request'])
context[variable] = cache.get('visited_pages_%s' % identify_by, [])
return u''
Использование: {% load_visited 'visited' %}
{% for title, uri, dt in visited %}
<a href="{{ uri }}">{{ title }} {% trans "at" %} {{ dt }}</a><br/>
{% endfor %}
Для экспериментов суть .
И все же вариант промежуточного программного обеспечения не дает мне покоя.
Теги: #django framework #django шаблоны #последние страницы #python #django
-
Виртуальная Земля: Теперь В 3D
19 Oct, 24 -
Глазные Интерфейсы. Отчет В Яндексе
19 Oct, 24 -
Датчик Присутствия Туалета
19 Oct, 24 -
Чем Раньше Вылет, Тем Меньше Задержка
19 Oct, 24