Wagtail / Django 内置主菜单

3

我开始使用 Wagtail CMS 进行项目开发,了解到它的页面原则是具有层级关系,使我得出结论:页面要么是父子关系,要么是兄弟关系。

因此,我的做法是将主页作为起点,其他所有页面都是该页面的子页面。

以下是我的页面结构:

                                   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将允许编辑器(非技术人员)添加尽可能多的这些页面,因为它们将作为"新闻"和"事件"页面的内容之一列出。
理想情况下,编辑器不应该创建主页、新闻、关于我们和事件的同级页面。如果编辑人员不是超级用户,也可以限制wagtail添加页面的功能。
但似乎没有明确简单的方法(也许是一个标记)来生成我的菜单。这是我在研究中发现的。
  1. 页面URL和slug URL,然而我无法在每个没有直接参考该页面模板的模板中使用。这也意味着它不是很动态。
  2. django-simple-menu对我来说似乎并不动态,因为我必须手动在代码中链接页面。此外,如果这是wagtail打算这样做的方式,那么它似乎浪费了内部维护页面层次结构的机会。
  3. 列表项似乎已被弃用,但即使它没有被弃用,也因为1和2的原因而显得繁琐。
2个回答

2
我也想要一个自动生成的菜单,但只需要一级菜单,包括主页。可能我做了一些天真的事情,但它起作用了。我使用的是 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 %}

这是结果:

这是结果: wagtail自动生成的菜单

现在我可以更改slug,打勾/取消“显示在菜单中”,我的bootstrap菜单会反映这些更改。

编辑: 我的上一个回答没有解决菜单项的自定义顺序问题。我们可以按照页面模型中的标准字段“first_published_at”或按“title”名称进行字母排序来排序项目。但我需要将其自定义。因此,我在每个页面模型中添加了自定义整数字段。然后,wagtail用户可以使用“promote”选项卡更改菜单项的顺序。

我的当前页面结构如下:

                             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进行排序。 我猜这不是最好的方法,但它能够工作。

1

2
会研究一下。不过我需要澄清一点,Wagtail没有内置工具来完成这个任务吗? - sqwale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接