我正在尝试通过本示例https://www.djangosnippets.org/snippets/1289/做面包屑,但是有错误Reverse for '' not found. '' is not a valid view function or pattern name.
我所做的一切都与本示例相同。但是我做错了。
此行{% breadcrumb_url 'Home' product_list %}
urls.py
app_name = 'shop'
urlpatterns = [
url(r'^$', views.product_list, name='product_list'),
url(r'^show/(?P<slug>[-\w]+)$', views.product_show, name='product_show'),
url(r'^(?P<category>[-\w]+)$', views.product_list, name='lst_by_ctgry'),
url(r'^(?P<category>[-\w]+)/(?P<subcategory>[-\w]+)$', views.product_list, name='lst_by_subctgry'),
url(r'^(?P<category>[-\w]+)/(?P<subcategory>[-\w]+)/(?P<kind>[-\w]+)$', views.product_list, name='lst_by_knds'),
]
base.html
{% load breadcrumbs %}
<!DOCTYPE html>
<html>
<head>
<title>Shop</title>
<meta charset="utf-8">
</head>
<body>
{% block breadcrumbs %}
{% breadcrumb_url 'Home' product_list %}
{% endblock %}
<div class="container">
{% block content %} {% endblock %}
</div>
</body>
</html>
breadcrumbs.py
from django import template
from django.template import loader, Node, Variable
from django.utils.encoding import smart_str, smart_text
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_text(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_text(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="#" alt="Arrow">""" \
"""</span>"""
if url:
crumb = "%s<a href='%s'>%s</a>" % (crumb, url, title)
else:
crumb = "%s %s" % (crumb, title)
return crumb
请帮助我。谢谢!
答案 0 :(得分:1)
当您指定{% breadcrumb_url 'Home' product_list %}
时,它假定product_list
是一个变量。相反,您希望将其用引号引起来,以表示它是URL的名称
breadcrumb_url
带有标题,后跟您应为url
赋予的相同参数。因此,既然您愿意
{% url 'shop:product_list' %}
面包屑网址变为
{% breadcrumb_url 'Home' 'shop:product_list' %}