【问题标题】:RoutablePageMixin and breadcrumbsRoutablePageMixin 和面包屑
【发布时间】:2017-01-24 20:03:48
【问题描述】:

如果您的所有页面都在树中(父母/孩子),那么像这样的标准 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 方法都返回“父”页面(即实际实例)的 URL,除此之外不是可以在面包屑中使用的程序化“标题”。

让面包屑系统对子页面和可路由页面同样适用的最佳方式是什么?

【问题讨论】:

    标签: django breadcrumbs wagtail


    【解决方案1】:

    回答我自己的问题(感谢罗伯特的提示)。在模型的路由定义中,添加如下内容:

    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 %}
    

    【讨论】:

      【解决方案2】:

      也许这会有所帮助。

      @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
      

      现在它在上下文中。

      【讨论】:

      • Robert 谢谢 - 但是你如何使用这种技术访问页面标题以用于面包屑?
      • 你的意思是 crumbs 路径中最后一页的标题吗?
      • 是的 - 该技术旨在引入的可路由页面的标题。我想您可以将其编码到上下文中 - 在我的 OP 中称为 self.title 的元素。
      • 想通了 - 请参阅下面的答案。感谢您为我指明正确的方向。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多