Как реализовать навигационные цепочки в шаблоне Django?

Проблема заключается в overflow: visible !important для элементов .

Следующее правило CSS активно все время:

select:not(:-internal-list-box) {
    overflow: visible !important;
}

Если вы установите переполнение .my-custom-forms на visible (так же, как элемент


Я также рекомендую использовать классы .form-row и .form-control на соответствующих элементах. Теперь вы можете переопределить правило CSS select.form-control:not([size]):not([multiple]), чтобы высота элементов

39
задан Peter Mortensen 7 October 2009 в 20:41
поделиться

6 ответов

Occastionally my Visual Studio will suddenly decide something like this. I have found it maybe help to toggle to release, do a full rebuild, then toggle back to debug.

//consulting.html
{% load breadcrumbs %}

{% block breadcrumbs %}
  {% breadcrumb_url 'Services' services %}
  {% breadcrumb_url 'Consulting' consulting %}
  {% breadcrumb 'We are great!' %}  
{% endblock %}

Существуют более сложные ситуации, когда вы можете захотеть включить идентификатор определенного объекта, что также легко сделать. Это более реалистичный пример:

{% load breadcrumbs %}

{% block breadcrumbs %}
{% breadcrumb_url 'Employees' employee_list %}
{% if employee.id %}
    {% breadcrumb_url employee.company.name company_detail employee.company.id %}
    {% breadcrumb_url employee.full_name employee_detail employee.id %}
    {% breadcrumb 'Edit Employee ' %}
{% else %}
    {% breadcrumb 'New Employee' %}
{% endif %}

{% endblock %}

Фрагмент хлебных крошек DaGood

Предоставляет два тега шаблона для использования в шаблонах HTML: breadcrumb и breadcrumb_url. Первый позволяет создать простой URL-адрес с текстовой и URL-частью. Или только несвязанный текст (например, последний элемент в журнале). Во-вторых, может фактически взять названный URL с аргументами! Кроме того, в качестве первого аргумента используется заголовок.

Это файл тега шаблона, который должен находиться в каталоге / templatetags.

Просто измените путь к изображению в методе create_crumb, и все готово!

Не забудьте {% load breadcrumbs%} в верхней части вашего HTML-шаблона!

from django import template
from django.template import loader, Node, Variable
from django.utils.encoding import smart_str, smart_unicode
from django.template.defaulttags import url
from django.template import VariableDoesNotExist

register = template.Library()

@register.tag
def breadcrumb(parser, token):
    """
    Renders the breadcrumb.
    Examples:
        {% breadcrumb "Title of breadcrumb" url_var %}
        {% breadcrumb context_var  url_var %}
        {% breadcrumb "Just the title" %}
        {% breadcrumb just_context_var %}

    Parameters:
    -First parameter is the title of the crumb,
    -Second (optional) parameter is the url variable to link to, produced by url tag, i.e.:
        {% url person_detail object.id as person_url %}
        then:
        {% breadcrumb person.name person_url %}

    @author Andriy Drozdyuk
    """
    return BreadcrumbNode(token.split_contents()[1:])


@register.tag
def breadcrumb_url(parser, token):
    """
    Same as breadcrumb
    but instead of url context variable takes in all the
    arguments URL tag takes.
        {% breadcrumb "Title of breadcrumb" person_detail person.id %}
        {% breadcrumb person.name person_detail person.id %}
    """

    bits = token.split_contents()
    if len(bits)==2:
        return breadcrumb(parser, token)

    # Extract our extra title parameter
    title = bits.pop(1)
    token.contents = ' '.join(bits)

    url_node = url(parser, token)

    return UrlBreadcrumbNode(title, url_node)


class BreadcrumbNode(Node):
    def __init__(self, vars):
        """
        First var is title, second var is url context variable
        """
        self.vars = map(Variable,vars)

    def render(self, context):
        title = self.vars[0].var

        if title.find("'")==-1 and title.find('"')==-1:
            try:
                val = self.vars[0]
                title = val.resolve(context)
            except:
                title = ''

        else:
            title=title.strip("'").strip('"')
            title=smart_unicode(title)

        url = None

        if len(self.vars)>1:
            val = self.vars[1]
            try:
                url = val.resolve(context)
            except VariableDoesNotExist:
                print 'URL does not exist', val
                url = None

        return create_crumb(title, url)


class UrlBreadcrumbNode(Node):
    def __init__(self, title, url_node):
        self.title = Variable(title)
        self.url_node = url_node

    def render(self, context):
        title = self.title.var

        if title.find("'")==-1 and title.find('"')==-1:
            try:
                val = self.title
                title = val.resolve(context)
            except:
                title = ''
        else:
            title=title.strip("'").strip('"')
            title=smart_unicode(title)

        url = self.url_node.render(context)
        return create_crumb(title, url)


def create_crumb(title, url=None):
    """
    Helper function
    """
    crumb = """<span class="breadcrumbs-arrow">""" \
            """<img src="/media/images/arrow.gif" alt="Arrow">""" \
            """</span>"""
    if url:
        crumb = "%s<a href='%s'>%s</a>" % (crumb, url, title)
    else:
        crumb = "%s&nbsp;&nbsp;%s" % (crumb, title)

    return crumb
44
ответ дан 27 November 2019 в 02:29
поделиться

Мои функции просмотра испускают хлебные крошки в виде простого списка.

Некоторая информация хранится в сеансе пользователя. Косвенно, однако, это происходит из URL.

Хлебные крошки - это не простой линейный список того, где они были - это ' Для чего нужна история браузера? Простой список того, где они были, не является хорошим следом крошки, потому что он не отражает никакого смысла.

Для большинства наших функций просмотра навигация довольно фиксирована и основана на шаблоне / представлении / URL дизайн. В наших случаях много подробностей, и хлебные крошки отражают это сужение - у нас есть «область», «список», «родитель» и «ребенок». Они образуют простую иерархию от общего к конкретному.

В большинстве случаев четко определенный URL-адрес может быть тривиально разбит на приятную цепочку крошек. Действительно, это один тест на хороший дизайн URL - URL можно интерпретировать как «хлебные крошки» и показывать его пользователям.

Для нескольких функций просмотра, где мы представляем информацию, которая является частью объединения «многие ко многим» , например, есть два кандидата в родители. URL может сказать одно, а стек контекста сеанса говорит другое.

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

6
ответ дан 27 November 2019 в 02:29
поделиться

Что-то подобное может работать в вашей ситуации:

Захватите весь URL в вашем представлении и сделайте ссылки из него. Это потребует изменения вашего urls.py, каждого представления, в котором должны быть хлебные крошки, и ваших шаблонов.

Сначала вы должны захватить весь URL-адрес в файле urls.py

оригинал urls.py
...
(r'^myapp/$', 'myView'),
(r'^myapp/(?P<pk>.+)/$', 'myOtherView'),
...
новый urls.py
...
(r'^(?P<whole_url>myapp/)$', 'myView'),
(r'^(?P<whole_url>myapp/(?P<pk>.+)/)$', 'myOtherView'),
...

Тогда, на ваш взгляд, что-то вроде:

views.py
...
def myView(request, whole_url):
    # dissect the url
    slugs = whole_url.split('/')
    # for each 'directory' in the url create a piece of bread
    breadcrumbs = []
    url = '/'
    for slug in slugs:
        if slug != '':
            url = '%s%s/' % (url, slug)
            breadcrumb = { 'slug':slug, 'url':url }
            breadcrumbs.append(breadcrumb)

    objects = {
        'breadcrumbs': breadcrumbs,
    }
    return render_to_response('myTemplate.html', objects)
...

Который должен быть извлечен в функцию, которая импортируется в представления, которым он нужен.

Затем в вашем шаблоне распечатайте панировочные сухари

. myTemplate.html
...
<div class="breadcrumb-nav">
    <ul>
    {% for breadcrumb in breadcrumbs %}
        <li><a href="{{ breadcrumb.url }}">{{ breadcrumb.slug }}</a></li>
    {% endfor %}
    </ul>
</div>
...

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

В любом случае, это один как вы могли бы сделать панировочные сухари, ура :))

0
ответ дан 27 November 2019 в 02:29
поделиться

http://www.djangosnippets.org/snippets/1289/ - предоставляет тег шаблона, но я ' Я не уверен, что это сработает, если у вас не будет должным образом объявлен ваш urls.py.

Ничего не сработает, если у вас не будет должным образом объявлен ваш urls.py . Сказав это, он не выглядит так, как будто он импортирует из urls.py . На самом деле, похоже, что для правильного использования этого тега вы все равно должны передать шаблону некоторые переменные. Хорошо, это не совсем так: косвенно через стандартный тег url , который вызывает тег breadcrumb . Но, насколько я понимаю, он даже не вызывает этот тег; все вхождения url являются локально созданными переменными.

Но я не эксперт в разборе определений тегов шаблонов. Так, скажем, где-то еще в коде это волшебным образом повторяет функциональность тега url. Похоже, вы используете аргументы для обратного поиска. Опять же, независимо от того, какой у вас проект, вы должны urls.py быть настроены так, чтобы к любому представлению можно было обратиться с помощью обратного просмотра. Это особенно верно с панировочными сухарями. Подумайте об этом:

home > accounts > my account

Должны ли когда-либо аккаунты, когда-либо содержать произвольный, жестко закодированный URL? Может ли «мой аккаунт» содержать произвольный, жестко запрограммированный URL? Как-то так или иначе вы будете писать крошки таким образом, что ваш urls.py будет перевернут. Это действительно произойдет только в одном из двух мест: по вашему мнению, с вызовом reverse или в шаблоне, с вызовом тега шаблона, который имитирует функциональность reverse . Могут быть причины, по которым предпочтение отдается первому, а не второму (в котором связанный фрагмент кода блокирует вас), но избегание логической конфигурации вашего файла urls.py не является одним из них.

3
ответ дан 27 November 2019 в 02:29
поделиться

Попробуйте django-mptt .

Утилиты для реализации модифицированного обхода дерева предзаказов (MPTT) с вашими классами модели Django и работы с деревья экземпляров модели.

3
ответ дан 27 November 2019 в 02:29
поделиться

Попробуйте django-breadcrumbs - подключаемое промежуточное программное обеспечение, которое добавляет вызываемый / итерируемый хлебный крошечный объект в ваш объект запроса.

Он поддерживает простые представления, общие представления и приложение Django FlatPages.

5
ответ дан 27 November 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: