RoutablePageMixin 和面包屑
RoutablePageMixin and breadcrumbs
如果您的所有页面都在树中 (parents/children),像这样的标准 Wagtail 面包屑系统可以完美运行:
{% block main %}
{% if self.get_ancestors|length > 1 %}
<ul class="breadcrumb">
{% for page in self.get_ancestors %}
{% if page.is_root == False and page.url != '/' %}
<li><a href="{% pageurl page %}">{{ page.title }}</a></li>
{% endif %}
{% endfor %}
<li class="active">{{ self.title }}</li>
</ul>
{% endif %}
{% endblock main %}
但是如果你的一些子页面不是真正的子页面,而是使用 RoutablePageMixin,它就会失败。因为可路由页面实际上是父页面的不同实例,所以面包屑路径无法向下到达可路由页面。
我想我可以在上下文中添加一些额外的信息来检测情况并对其进行特殊处理,但是所有的 WT URL 方法 return URL "parent" 页面(即实际实例),此外没有可以在面包屑中使用的程序化 "title"。
要使面包屑系统对子页面和可路由页面同样有效,最好的方法是什么?
也许这会有所帮助。
@route(_(r'^detail/(?P<activity_slug>[-\w]+)/$'))
def show_activity(self, request, activity_slug):
activity_model_class = self.activity_model_class
if not activity_model_class:
raise Http404('No activity model.')
else:
queryset = self.get_activity(activity_slug)
try:
activity = queryset.get()
except activity_model_class.DoesNotExist:
raise Http404('activity not found')
else:
self.current_url = self.get_url(
'show_activity',
kwargs = {'activity_slug': activity_slug}
)
现在可路由页面有 current_url
def get_context(self, request, *args, **kwargs):
context = super().get_context(request)
context['current_url']= self.current_url
return context
现在它在上下文中。
回答我自己的问题(感谢罗伯特的提示)。在模型中的路由定义中,添加如下内容:
ctx['routed_title'] = 'Staff'
然后像这样修改上面的面包屑示例(检查上下文中是否存在新元素并附加到面包屑):
{% block main %}
{% if self.get_ancestors|length > 1 %}
<ul class="breadcrumb">
{% for page in self.get_ancestors %}
{% if page.is_root == False and page.url != '/' %}
<li><a href="{% pageurl page %}">{{ page.title }}</a></li>
{% endif %}
{% endfor %}
{# If this is a routable, add non-parent/child link from context #}
{% if routed_title %}
<li><a href="{% pageurl page %}">{{ page.title }}</a></li>
<li class="active">{{ routed_title }}</li>
{% else %}
<li class="active">{{ self.title }}</li>
{% endif %}
</ul>
{% endif %}
{% endblock main %}
如果您的所有页面都在树中 (parents/children),像这样的标准 Wagtail 面包屑系统可以完美运行:
{% block main %}
{% if self.get_ancestors|length > 1 %}
<ul class="breadcrumb">
{% for page in self.get_ancestors %}
{% if page.is_root == False and page.url != '/' %}
<li><a href="{% pageurl page %}">{{ page.title }}</a></li>
{% endif %}
{% endfor %}
<li class="active">{{ self.title }}</li>
</ul>
{% endif %}
{% endblock main %}
但是如果你的一些子页面不是真正的子页面,而是使用 RoutablePageMixin,它就会失败。因为可路由页面实际上是父页面的不同实例,所以面包屑路径无法向下到达可路由页面。
我想我可以在上下文中添加一些额外的信息来检测情况并对其进行特殊处理,但是所有的 WT URL 方法 return URL "parent" 页面(即实际实例),此外没有可以在面包屑中使用的程序化 "title"。
要使面包屑系统对子页面和可路由页面同样有效,最好的方法是什么?
也许这会有所帮助。
@route(_(r'^detail/(?P<activity_slug>[-\w]+)/$'))
def show_activity(self, request, activity_slug):
activity_model_class = self.activity_model_class
if not activity_model_class:
raise Http404('No activity model.')
else:
queryset = self.get_activity(activity_slug)
try:
activity = queryset.get()
except activity_model_class.DoesNotExist:
raise Http404('activity not found')
else:
self.current_url = self.get_url(
'show_activity',
kwargs = {'activity_slug': activity_slug}
)
现在可路由页面有 current_url
def get_context(self, request, *args, **kwargs):
context = super().get_context(request)
context['current_url']= self.current_url
return context
现在它在上下文中。
回答我自己的问题(感谢罗伯特的提示)。在模型中的路由定义中,添加如下内容:
ctx['routed_title'] = 'Staff'
然后像这样修改上面的面包屑示例(检查上下文中是否存在新元素并附加到面包屑):
{% block main %}
{% if self.get_ancestors|length > 1 %}
<ul class="breadcrumb">
{% for page in self.get_ancestors %}
{% if page.is_root == False and page.url != '/' %}
<li><a href="{% pageurl page %}">{{ page.title }}</a></li>
{% endif %}
{% endfor %}
{# If this is a routable, add non-parent/child link from context #}
{% if routed_title %}
<li><a href="{% pageurl page %}">{{ page.title }}</a></li>
<li class="active">{{ routed_title }}</li>
{% else %}
<li class="active">{{ self.title }}</li>
{% endif %}
</ul>
{% endif %}
{% endblock main %}