在Google上搜索"Django breadcrumbs"时提供的一些解决方案包括使用模板和block.Super,基本上就是扩展基块并向其中添加当前页面.http://www.martin-geber.com/thought/2007/10/25/breadcrumbs-django-templates/

http://www.djangosnippets.org/snippets/1289/-提供了一个模板标记,但是如果您没有正确声明urls.py,我不确定这是否会起作用.

我想知道最好的方法是什么?如果你以前实现过面包屑,你是怎么做到的?

-编辑--

我的问题应该是:在Django中有没有一种被普遍接受的面包屑制作方法,但从我看到的答案来看,没有,而且有很多不同的解决方案,我不确定应该把正确的答案授予谁,因为我使用了一种使用block.Super方法的变体,而下面的所有答案都可以.

我想这是一个太主观的问题了.

推荐答案

Note: I provide the full snippet below, since djangosnippets has been finicky lately.

酷,有人居然发现了my个代码片段:-)我的模板标签的使用相当简单.

要回答您的问题,没有处理面包屑的"内置"Django机制,但它确实为我们提供了第二好的东西:自定义模板标记.

假设您想要如下所示的面包屑:

Services -> Programming
Services -> Consulting

然后,您可能会有几个命名URL:"服务"和"编程"、"咨询":

    (r'^services/$',
     'core.views.services',
     {},
     'services'),

    (r'^services/programming$',
     'core.views.programming',
     {},
     'programming'),

    (r'^services/consulting$',
     'core.views.consulting',
     {},
     'consulting'),

现在,在您的html模板中(让我们只看一下咨询页面),您所要做的就是:

//consulting.html
{% load breadcrumbs %}

{% block breadcrumbs %}
{% breadcrumb_url 'Services' services %}
{% breadcrumb_url 'Consulting' consulting %}

{% endblock %}

如果您想在面包屑中使用某种自定义文本,并且不想链接它,您可以改用breadcrumb标签.

//consulting.html
{% load breadcrumbs %}

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

在更复杂的情况下,可能需要包含特定对象的id,这也很容易做到.这是一个更现实的例子:

{% 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目录的templatetag文件.

只需在create_crump方法中更改图像的路径,就可以了!

别忘了在html模板顶部{%load breadcrumbs%}!

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

Django相关问答推荐

使用django直接计算geohash而不创建模型

我如何告诉Django如何恢复自定义迁移?

按下按钮刷新在html文件中显示的变量

相同的字符串不同的翻译

Django 在模型中存储用户图像

如何在 django tests.py 中创建管理员用户

如何使用自定义 AdminSite 类?

Django 基于角色的视图?

relation "django_site" does not exist

如何在 django 模板中将名称反转为绝对 url?

如何在 twitter-bootstrap 模式窗口中插入 django 表单?

测试 Django 信号的正确方法

如何在 Django Rest Framework SimpleRouter 上使斜杠可选

在 Django 1.8 或更高版本中填充时出现Models aren't loaded yet"错误

整数的Python正则表达式?

如何在不发送信号的情况下保存模型?

具有 2 种语言的 Django 站点

Django:按位置排序,忽略 NULL

在 Python 中生成 API KEY 和 SECRET 的最简单和最安全的方法是什么

如何检测 Heroku 的环境?