Wagtail / Django 内置主菜单

Wagtail / Django inbuilt main menu

开始了一个使用 Wagtail CMS 的项目,我对他们的主要页面的理解是它是分层的,这让我得出结论,页面要么是 parent/child 相关的,要么是兄弟的。

所以我的做法是让我的主页着陆,所有其他页面都是该页面的子页面。

这是我的结构

                                   Home page
                        /             |                     \
                    News            About us               Events
                  /  |   \                             /     |     \
          n_item   n_item  n_item               e_item   e_item   e_item

所以它们是 6 种类型的页面

  1. 主页 *(唯一)
  2. 新闻 *(唯一)
  3. n_item(新闻)
  4. 关于我们 *(独一无二)
  5. 事件 *(唯一)
  6. e_item(活动项目)

然后我在上面列表中加星标的页面 (*) 的推广选项卡中勾选了 "Show in menus:"。

n_item 和 e_item 将允许编辑(非技术)人员根据需要添加任意数量的这些页面,因为它们将作为内容的一部分列在 "News" 和 "Events" 页。

理想情况下,编辑不应为主页、新闻、关于我们和活动创建同级。如果编辑不是超级用户,是否也可以限制编辑可以添加页面的 wagtails 功能?

但似乎没有明确简单的方法(也许是标签)来生成我的菜单。这是我在研究中发现的。

  1. page url and slug url 我似乎无法在每个未被该页面模板直接引用的模板中工作。这也意味着它不是那么动态
  2. django-simple-menu 对我来说似乎不是动态的,因为我必须在代码中手动 link 页。另外,如果 wagtail 打算这样做,那么在内部维护页面层次结构似乎是一种浪费。
  3. List item 似乎已被弃用,但即使不是,它看起来也很麻烦,原因与 1 和 2
  4. 相同

你见过https://github.com/rkhleics/wagtailmenus吗?它旨在 "manage and render multi-level navigation and simple flat menus in a consistent, flexible way"。

我也想自动生成菜单,但只有主页的第一级。我可能做了一些天真的事情,但它有效。我正在使用 Wagtail 2.5.1 和 Django 2.2.2

我的 Wagtail 页面结构如下所示:

                                 Home page
                    /                                   \
                Blog                                   About
              /  |   \                            
      n_item   n_item  n_item 

我正在使用 bootstrap4,所以这是我在 base.html 模板中的导航:

{% with root_p=request.site.root_page %}

        {# this is static item for home #}
        <ul class="navbar-nav ml-auto">
          <li class="nav-item">
                <a class="nav-link {% if '/' == request.path %} active {% endif %}" href="{{root_p.url}}">{{root_p.slug}}</a>
          </li>

        {# Here I am looping home's childrens #}
          {% for nav in root_p.get_children.live %}
              {% if nav.show_in_menus %}
                  <li class="nav-item">
                      <a class="nav-link {% if nav.slug in request.path %} active {% endif %}" href="{{nav.url}}">{{nav.slug}}</a>
                  </li>
              {% endif %}
          {% endfor %}
        </ul>

{% endwith %}

这是结果:

现在我可以更改 slug,tick/untick "show in menus" 和我的 bootstrap 菜单反映了这些更改。

编辑: 我的最后一个回答没有解决菜单项的自定义顺序。我们可以按页面模型 "first_published_at" 中的标准字段或 "title" 名称的字母顺序对项目进行排序。但我需要定制它。所以我在我的每个页面模型中添加了自定义整数字段。然后 wagtail 用户可以使用 "promote tab".

更改菜单项的顺序

我当前的页面结构是这样的:

                             Home
                /              |           \
         Case studies      Services      Contact

我的页面模型:(仅服务示例)

class ServicesPage(Page):

    template = "home/services.html"
    max_count = 1     
    subpage_types = []
    menu_order = models.IntegerField(default = 0, help_text = "Setup custom menu order")

    promote_panels = Page.promote_panels + [
       FieldPanel('menu_order'),
   ]
    class Meta:
        verbose_name = "Services"
        verbose_name_plural = "Services"

这是每个页面模型的推广选项卡中的样子

最后一步是在基本模板中编辑导航栏循环:

{% with root_p=request.site.root_page %}
      {% for nav in root_p.get_children.specific.live|dictsort:"menu_order" %}
      {% if nav.show_in_menus %}
      <li class="nav-item {% if nav.slug in request.path %} active {% endif %}">
          <a class="nav-link" href="{{nav.url}}">{{nav.title}}</a>
      </li>
      {% endif %}
      {% endfor %}
{% endwith %}

为了订购,我使用默认的 django 模板过滤器 dictsort。 我想这不是最好的方法,但它确实有效。