当前位置:  开发笔记 > 编程语言 > 正文

如何在Django模板中实现面包屑?

如何解决《如何在Django模板中实现面包屑?》经验,为你挑选了5个好方法。

在谷歌搜索"Django面包屑"时提供的一些解决方案包括使用模板和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方法的变体,而以下所有答案都可以使用.

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



1> Andriy Drozd..:

注意:我提供下面的完整代码段,因为djangosnippets最近一直很挑剔.

很酷,有人实际上找到了我的代码片段:-)使用我的模板标签非常简单.

要回答你的问题,没有用于处理面包屑的"内置"django机制,但它确实为我们提供了下一个最好的东西:自定义模板标签.

想象一下,你想要像这样的面包屑:

Services -> Programming
Services -> Consulting

那么你可能会有一些命名的网址:"服务","编程","咨询":

    (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目录的模板标签文件.

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

不要忘记在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 = """""" \
            """Arrow""" \
            """"""
    if url:
        crumb = "%s%s" % (crumb, url, title)
    else:
        crumb = "%s  %s" % (crumb, title)

    return crumb



2> 小智..:

Django管理视图模块具有自动面包屑,其实现方式如下:

{% block breadcrumbs %}
    
{% endblock %}

所以有一些内置的支持..



3> S.Lott..:

我的视图函数将面包屑作为简单列表发出.

某些信息保存在用户的会话中.然而,间接地,它来自URL.

面包屑并不是他们所处位置的简单线性列表 - 这就是浏览器历史记录的用途.他们去过的地方的简单列表并没有成为良好的面包屑痕迹,因为它没有反映出任何意义.

对于我们的大多数视图功能,导航非常固定,并且基于模板/视图/ URL设计.在我们的案例中,有很多深入细节,面包屑反映了缩小 - 我们有一个"领域",一个"列表",一个"父母"和一个"孩子".它们形成了从一般到特定的简单层次结构.

在大多数情况下,一个明确定义的URL可以简单地分解成一个很好的痕迹.实际上,这是一个良好的URL设计测试 - URL可以被解释为面包屑并有意义地显示给用户.

对于一些视图函数,例如,我们提供的信息是"多对多"连接的一部分,有两个候选父项.URL可以说一件事,但会话的上下文堆栈说另一个.

出于这个原因,我们的视图函数必须在会话中留下上下文线索,以便我们可以发出面包屑.



4> minder..:

尝试django-breadcrumbs - 一个可插入的中间件,在您的请求对象中添加可调用/可迭代的面包屑.

它支持简单视图,通用视图和Django FlatPages应用程序.



5> Łukasz Mierz..:

我有同样的问题,最后我为它制作了简单的django tempalate标签:https://github.com/prymitive/bootstrap-breadcrumbs

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有