Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Реализуем last visited/recent pages в Django

Anna | 16.06.2014 | нет комментариев
У меня Зачастую бывает так, что на новом источнике я теряюсь в море различных функций и настроек, и для того, Дабы не утратить из виду что-то увлекательное, открываю/дублирую вкладку. Это не неизменно комфортно, да и кнопка «назад» изредка работает непредсказуемо, скажем, в связи с push history, либо из-за «сломавшегося» на редиректе обработчика POST (не гневна, а эксперимента ради). Следственно, Дабы не раздражать пользователя, я решил сделать recent pages. История об этом под катом.

Вариант 1-й

Первоначально я хотел реализовать эту функцию через Middleware, но столкнулся с загвоздкой: запомнить url и положить в кэш — не задача, а вот получить нынешний title страницы — да. И я до сих пор думаю, что исключительный верный метод реализовать это — применять middleware. Дурацкие решения: применятьprocess_response() и парсить title; применять для приобретения title ajax-скрипт на стороне заказчика и все схожее этому. Следственно, необходимо как-то добраться до шаблонизатора из middleware и получить там корневой {% block title %}. Буду рад, если поделитесь идеей на данный счет.

Вариант 2-й

Применять templatetag. Именно так я это и сделал, но значительный минус этого варианта в том, что необходимо руками править образцы, либо думать, как встроить данный tag в base.html.

Вариант 3-й

Применять ajax-скрипт а-ля трекер статистики. Плюс этого варианта в том, что итоги дозволено применять для различных нужд, скажем, для статистики. Минусы — ненужный скрипт, лишние обработчики, лишние данные.

Тэг для сохранения title

Если вы используете ajax-запросы к тем же view, то стоит добавить проверку 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 %}

Для экспериментов gist. И все же, не дает покоя мне middleware-вариант.

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB