1. Alexander Koval

    02.04.2010

    2 ↑
    1 ↓
    Собственно нужны были хлебные крошки для проекта. Ничего путного и удобного для себя не нашел, поэтому написал свои и решил выложить - может кому-нибудь да пригодится.

    http://bitbucket.org/anti_social/django-simplecrumbs/wiki/Home

    Скачать можно коммандой:
    hg clone http://bitbucket.org/anti_social/django-simplecrumbs/

    Для затравки покажу пример использования во вьюхах для примитивного интернет магазина:
    from simplecrumbs import breadcrumb

    @render_to('index.html')
    @breadcrumb(_('Shop'))
    def index(request):
    # some code
    return {}

    @render_to('category.html')
    @breadcrumb(parent=index, obj_key='cat')
    def category(request, cat_id, filters=''):
    # some code
    return {"products": products, "cat": cat}
    category.bc_name = lambda cat: cat.name
    category.bc_url = lambda cat: reverse('view_name', kwargs={'cat_id':cat.pk})
    category.bc_parents = lambda cat: cat.parents

    @render_to('item.html')
    @breadcrumb(parent=category, obj_key='item')
    def item(request, item_id):
    # some code
    return {"item":item}
    item.bc_next = lambda i: i.cat
    Урлы и названия крошек он берет у объектов моделей, вызывая методы __unicode__ и get_absolute_url. Если хочется переопределить это, то можно у вьюхи установить аттрибуты bc_name и bc_url. В случае, если объект не задан, то вызывает reverse.

    Буду рад любым замечаниям, пожеланиям и в особенности bug report'ам.
  2. Если вы и так используете декораторы, то зачем эти ужасные присвоения атрибутов функции? Почему не сделать это в декораторе?

  3. Alexander Koval

    02.04.2010

    0 ↑
    0 ↓
    Почему ужасные? В Джанго используются довольно часто. Мне просто показалось, что передавать в декоратор колбэки - это хуже. Но вообще я собирался реализовать и передачу функций в декоратор.

    Меня больше интересует мнение о самой идее таких breadcrumb'ов.
  4. admin

    03.04.2010

    0 ↑
    0 ↓

    Меня больше интересует мнение о самой идее таких breadcrumb'ов.

    опишите идею. пока не очень понятно.

  5. Alexander Koval

    03.04.2010

    0 ↑
    0 ↓
    Идея в том, чтобы построить зависимости между view-функциями. Тогда по текущей функции можно построить навигацию сайта.

    Представим вьюху для изменения пароля. Я хочу, чтобы в навигации отображалось следующее:

    Главная >> Профиль >> Изменение пароля

    django-breadcrumbs, например, предлагает примерно такое использование:
    def index(request):
    request.breadcrumbs(u'Главная', reverse('app_name.views.index'))
    ...

    def profile(request):
    request.breadcrumbs(u'Главная', reverse('app_name.views.index'))
    request.breadcrumbs(u'Профиль', reverse('app_name.views.profile'))
    ...

    def change_password(request):
    request.breadcrumbs(u'Главная', reverse('app_name.views.index'))
    request.breadcrumbs(u'Профиль', reverse('app_name.views.profile'))
    request.breadcrumbs(u'Изменение пароля', reverse('app_name.views.change_password'))
    ...
    Налицо куча ненужных повторений.

    Я же предлагаю примерно следующее использование (если вы используете декоратор render_to от Александра Соловьёва; если нет, то смотрите примеры как использовать без render_to - http://bitbucket.org/anti_social/django-simplecrumbs/wiki/Home):
    @breadcrumb(u'Главная')
    def index(request):
    ...

    @breadcrumb(u'Профиль', parent=index)
    def profile(request):
    ...

    @breadcrumb(u'Измение пароля', parent=profile):
    def change_password(request):
    ...
    Меньше кода, проще изменять структуру навигации.
  6. zw0rk.blogspot.com

    03.04.2010

    0 ↑
    0 ↓
    Меньше кода, проще изменять структуру навигации.
    Да ну? А если надо вставить новый элемент посередине в какой-нибудь более-менее разветвленный "список зависимостей"? Имхо, вы строите очень искусственную структуру поверх непредназначенной для этого другой структуры.
  7. Alexander Koval

    04.04.2010

    0 ↑
    0 ↓
    Да ну? А если надо вставить новый элемент посередине в какой-нибудь более-менее разветвленный "список зависимостей"?
    Я и не утверждаю, что мои хлебные крошки можно прикрутить к любому django-приложению. Но приведите конкретный пример, и я попробую найти решение.
    Имхо, вы строите очень искусственную структуру поверх непредназначенной для этого другой структуры.
    Ничего искусственого я тут не вижу - практически на любом сайте вьюхи организованы в древовидную структуру.

    Объясните поверх какой другой структуры я что-то строю?
  8. astur.net.ru

    04.04.2010

    1 ↑
    0 ↓

    практически на любом сайте вьюхи организованы в древовидную структуру.

    Не берите пример с "практически любых" сайтов. Берите пример с хороших.

    По уму либо есть древовидная структура вьюх, но она настолько простая, что крошки проще прописать руками, либо древовидная структура страниц и разделов отражена не во вьюхах, а в базе, и ваши крошки туда прикрутить сложно.

  9. Alexander Koval

    04.04.2010

    0 ↑
    0 ↓
    Не берите пример с "практически любых" сайтов. Берите пример с хороших.
    Приведите пример "хорошего" сайта.
  10. astur.net.ru

    05.04.2010

    0 ↑
    0 ↓

    Приведите пример "хорошего" сайта.

    yandex.ru :)

  11. admin

    05.04.2010

    1 ↑
    0 ↓
    Меньше кода, проще изменять структуру навигации.
    часто иерархия страниц отдается на откуп контент-редактору. поэтому было бы здорово менять её без правок кода. я не критикую идею с декораторами. местами это может быть полезно. просто хочется, чтобы за ними был api для формирования крошек программными средствами. без глобальных инстансов и т.п. херни.

    попробуйте писать doctest'ы. ;)
  12. Alexander Koval

    06.04.2010

    0 ↑
    0 ↓
    часто иерархия страниц отдается на откуп контент-редактору. поэтому было бы здорово менять её без правок кода. я не критикую идею с декораторами. местами это может быть полезно. просто хочется, чтобы за ними был api для формирования крошек программными средствами. без глобальных инстансов и т.п. херни.
    Вот это интересная идея. Но в этом случае придется иерархию хранить в базе, а это в свою очередь сильно усложнит крошки. Во-вторых контент-редакторы могут выстроить нерабочую иерархию. Например, в моем первом посте есть такой код:
    item.bc_next = lambda i: i.cat
    Это нужно для того, чтобы по товару можно было выстроить и все родительские категории. Но что будет если редактор выстроит такую иерархию: Главная -> Товар -> Категория.

    Пока я прикрутил свои крошки в 2 приложения: интернет-магазин и доска объявлений. Иерархия там достаточно простая и особых проблем не было.
    попробуйте писать doctest'ы. ;)
    Спасибо за совет, постараюсь исправиться.
  13. Alexander Koval

    06.04.2010

    0 ↑
    1 ↓
    yandex.ru :)
    Фактически яндекс - это не сайт, а портал, состоящий из кучи сайтов.

    Навигацию в виде хлебных крошек я нашел только на маркете. Просто не везде хлебные крошки нужны.

    Приведите конкретный пример с упрощенной схемой, например, вашего сайта, где нужна навигация, но невозможно или трудно прикрутить мои крошки.
  14. admin

    06.04.2010

    0 ↑
    0 ↓

    Но в этом случае придется иерархию хранить в базе,

    не-а. фреймворк должен хранить иерархию за интерфейсом доступа к иерархии. а база там, массивы, или mock'и для тестов не суть важно. :)

    Приведите конкретный пример с упрощенной схемой, например, вашего сайта, где нужна навигация, но невозможно или трудно прикрутить мои крошки.

    посмотрите как ведут себя крошки на этом сайте. у них нет общей иерархии, а заголовки меняются в зависимости от страницы (не знаю, баг это или фича). )

  15. Ivan Sagalaev

    06.04.2010

    0 ↑
    0 ↓

    посмотрите как ведут себя крошки на этом сайте.

    На этом сайте их, по сути, и нет. Есть ссылки на нужные страницы, которые иногда внешне похожи на крошки.

  16. Alexander Koval

    06.04.2010

    0 ↑
    0 ↓
    не-а. фреймворк должен хранить иерархию за интерфейсом доступа к иерархии. а база там, массивы, или mock'и для тестов не суть важно. :)
    В любом случае, как я уже писал выше, нужно как-то отслеживать заведомо неправильные иерархии.
    Например на этом форуме вверху мы видим такую навигацию - Форумы: Django. Зачем давать контент-менеджеру возможность изменять иерархию в этом случае?
    посмотрите как ведут себя крошки на этом сайте. у них нет общей иерархии, а заголовки меняются в зависимости от страницы (не знаю, баг это или фича). )
    Мне не нравятся крошки на этом сайте, как раз потому, что, если я хочу перейти на главную, я не могу это сделать в один клик. И таки думаю к этому форуму мои крошки можно прикрутить легко. Возможно в скором времени мне понадобится форум на сайт, так что попробую.

    Вот на этом сайте работают мои крошки, можете посмотреть: http://www.stroysfera.com.ua/shop/item/7745/. На каждую вьюху понадобилось добавить буквально одну строчку.
  17. Alexander Koval

    06.04.2010

    0 ↑
    0 ↓
    Вот что мне действительно не нравится на данный момент - это, если не пользоваться render_to, то нужно в каждой вьюхе передавать breadcrumbs в контекст. Надо будет сделать middleware и context processor для этого.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.