Google 搜索“Django breadcrumbs”时提供的一些解决方案包括使用模板和 block.super,基本上只是扩展基本 block 并将当前页面添加到其中。 http://www.martin-geber.com/thought/2007/10/25/breadcrumbs-django-templates/
http://www.djangosnippets.org/snippets/1289/ - 提供了一个模板标签,但如果您没有正确声明 urls.py,我不确定这是否有效。
我想知道最好的方法是什么?如果您以前实现过面包屑导航,您是怎么做到的?
--- 编辑 --
我的问题本来是:在 Django 中是否有一种普遍接受的做面包屑的方法,但从我看到的答案来看没有,而且有很多不同的解决方案,我不确定应该给谁正确的答案到,因为我使用了 block.super 方法的变体,而以下所有答案都有效。
我想这是一个太主观的问题。
最佳答案
注意:我在下面提供了完整的代码片段,因为 djangosnippets 最近很挑剔。
太棒了,居然有人找到了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 目录中。
只需在方法 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 = """<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 %s" % (crumb, title)
return crumb
关于django - 如何在 Django 模板中实现面包屑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/826889/