如何在Django模板中实现面包屑? [英] How to implement breadcrumbs in a Django template?

查看:1249
本文介绍了如何在Django模板中实现面包屑?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Some solutions provided on doing a Google search for "Django breadcrumbs" include using templates and block.super, basically just extending the base blocks and adding the current page to it. http://www.martin-geber.com/thought/2007/10/25/breadcrumbs-django-templates/

http://www.djangosnippets.org/snippets/1289/ - 提供了一个模板标签,但如果没有您的网址,我不知道这将工作。 py正确声明。

http://www.djangosnippets.org/snippets/1289/ - provides a template tag but I'm not sure this would work if you don't have your urls.py properly declared.

我想知道最好的方法是什么?如果您在执行之前已经执行了面包屑?

I'm wondering what's the best way? And if you have implemented breadcrumbs before how did you do it?

---编辑 -

我的问题是:在Django中是否有普遍接受的方法来做面包屑,但是从答案中我看到没有,并且有许多不同的解决方案,我不知道谁给出正确的答案,因为我使用了一个使用block.super方法的变体,而所有下面的答案都可以正常工作。

My question was meant to be: is there a general accepted method of doing breadcrumbs in Django, but from the answers I see there is not, and there are many different solutions, I'm not sure who to award the correct answer to, as I used a variation of using the block.super method, while all the below answers would work.

我猜这是一个太多的主观问题。

I guess then this is too much of a subjective question.

推荐答案

注意:我提供了完整的代码片段,因为djangosnippets最近已经很好奇了。

很酷,有人实际上发现我的片段:-)使用我的模板标签是相当简单的。

Cool, someone actually found my snippet :-) The use of my template tag is rather simple.

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

To answer your question there is no "built-in" django mechanism for dealing with breadcrumbs, but it does provide us with the next best thing: custom template tags.

想象你想要这样的面包屑:

Imagine you want to have breadcrumbs like so:

Services -> Programming
Services -> Consulting

然后你可能会有几个命名的urls:services和programming,咨询:

Then you will probably have a few named urls: "services", and "programming", "consulting":

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

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

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

现在在你的html模板(让我们看看咨询页面)所有你必须放在的是:

Now inside your html template (lets just look at consulting page) all you have to put is:

//consulting.html
{% load breadcrumbs %}

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

{% endblock %}

如果你想在面包屑中使用某种自定义文本,不要想要链接,您可以使用面包屑标签。

If you want to use some kind of custom text within the breadcrumb, and don't want to link it, you can use breadcrumb tag instead.

//consulting.html
{% load breadcrumbs %}

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

有更多的涉及的情况,你可能想要包括一个特定的对象的id,这也很容易做到。这是一个更现实的例子:

There are more involved situations where you might want to include an id of a particular object, which is also easy to do. This is an example that is more realistic:

{% 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!另外它需要一个标题作为第一个参数。

DaGood breadcrumbs snippet

Provides two template tags to use in your HTML templates: breadcrumb and breadcrumb_url. The first allows creating of simple url, with the text portion and url portion. Or only unlinked text (as the last item in breadcrumb trail for example). The second, can actually take the named url with arguments! Additionally it takes a title as the first argument.

这是一个templateatetag文件,应该进入你的/ templatetags目录。

This is a templatetag file that should go into your /templatetags directory.

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

Just change the path of the image in the method create_crumb and you are good to go!

不要忘记{%load breadcrumbs%}顶部的html模板!

Don't forget to {% load breadcrumbs %} at the top of your html template!

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模板中实现面包屑?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆