LINUX.ORG.RU

Видимо, имеется в виду что-то такое:

# urls.py

    ...
    (r'^categories/(\d+)/$', 'view_category'),
    (r'^categories/(\d+)/topics/(\d+)/$', 'view_topic'),
    (r'^categories/(\d+)/topics/(\d+)/comments/(\d+)/$', 'view_comment'),
    ...

# views.py

def view_category(request, id):
    ...
view_topic.breedcrumb_title = 'Раздел'

def view_topic(request, category_id, id):
    ...
view_topic.breedcrumb_parent = view_forum
view_topic.breedcrumb_title = 'Тема'

def view_comment(request, category_id, topic_id, id):
    breedcrumb = make_breedcrumb(view_comment, [category_id, topic_id, id])
    ...
view_comment.breedcrumb_parent = view_topic
view_comment.breedcrumb_title = 'Комментарий'

def make_breedcrumb(view, ids):
    url = reverse(view, args=ids)
    html = '<a href="%s">%s</a>' % (url, view.breedcrumb_title)
    if hasattr(view, 'breedcrumb_parent'):
        upper_breedcrumb = make_breedcrumb(view.breedcrumb_parent, ids[:-1])
        return '%s / %s' % (upper_breedcrumb, html)
    return html
tarc
()
Ответ на: комментарий от AlexKiriukha

Вроде ясно, спасибо за разъяснения.

Можно даже в БД лазить, при желании, если, конечно, не жалко эту самую БД.

Мой пример:

#pages/views.py
def page(request):
    try:
        page = Page.objects.select_related().get(path=request.path)
    except Page.DoesNotExist:
        raise Http404
    return render_to_response("page.html", 
                              {"page" : page}, 
                              RequestContext(request))

page.get_title = lambda path : Page.objects.select_related().get(path=path).header

#pages/templatetags/page_tags.py
@register.inclusion_tag("breadcrumb.html")
def breadcrumb(path):
    '''Create  breadcrumb from request path.'''
    chunks = [chunk for chunk in path.split("/") if chunk]
    breadcrumbs = []
    for i in range(len(chunks) + 1):
        subpath =  '/' + '/'.join(chunks[:i]) + '/'
        try:
            view, args, kwargs = resolve(subpath)
            breadcrumbs.append((subpath, view.get_title(subpath, *args, **kwargs)))
        except:
            pass
    return {"breadcrumbs" : breadcrumbs}

В данном проекте вся навигация была по path с некоторыми костылями, так что не судите строго.

//тот анонимус

anonymous
()
Ответ на: комментарий от anonymous

Upd:

Вот breadcrumb.html, если что: [code=html] <p> <a href=«/»>Главная</a> {% for item in breadcrumbs %} {% if forloop.first %}::{% endif %} {% if item.1 %} <a href=«{{ item.0 }}»>{{ item.1 }}</a> {% endif %} {% if not forloop.last and item.1 %}::{% endif %} {% endfor %} </p> [/code]

Тут, по хорошему, надо не заниматься ерундой с item.0, и передавать сразу dict из функции тэга breadcrumb, чтобы было понятнее и проще. Но код был сделан давно:)

Идею я не сам придумал, это всё Сагалаев ( http://softwaremaniacs.org/about/ ), ему спасибо.

anonymous
()
Ответ на: комментарий от trashymichael

хотя попытки были но я пришел к выводу что такой путь самый простой и универсальный

trashymichael ★★★
()
Ответ на: комментарий от AlexKiriukha

ну а вот если я, например, пришел на страницу B со страницы A, и обоим страницам нужно передавать pk для reverse, причем разный у обеих (например книга пользователя), тогда такое решение не подходит (или я туплю)?..

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

Если я правильно понял, то вопрос в том, будет ли правильный breadcrumb для ссылок /users/username/book/1/ и /users/username/book/2/. Если этот вопрос, то да, потому что title - callable. Недостаток - лишние запросы к базе, но тут уж честно предупреждали.

Тему поднял потому что не додумался до resolve. С ним всё стало как-то просто и логично :-)

AlexKiriukha ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.