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 种类型的页面
- 主页 *(唯一)
- 新闻 *(唯一)
- n_item(新闻)
- 关于我们 *(独一无二)
- 事件 *(唯一)
- e_item(活动项目)
然后我在上面列表中加星标的页面 (*) 的推广选项卡中勾选了 "Show in menus:"。
n_item 和 e_item 将允许编辑(非技术)人员根据需要添加任意数量的这些页面,因为它们将作为内容的一部分列在 "News" 和 "Events" 页。
理想情况下,编辑不应为主页、新闻、关于我们和活动创建同级。如果编辑不是超级用户,是否也可以限制编辑可以添加页面的 wagtails 功能?
但似乎没有明确简单的方法(也许是标签)来生成我的菜单。这是我在研究中发现的。
- page url and slug url 我似乎无法在每个未被该页面模板直接引用的模板中工作。这也意味着它不是那么动态
- django-simple-menu 对我来说似乎不是动态的,因为我必须在代码中手动 link 页。另外,如果 wagtail 打算这样做,那么在内部维护页面层次结构似乎是一种浪费。
- List item 似乎已被弃用,但即使不是,它看起来也很麻烦,原因与 1 和 2
相同
你见过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。
我想这不是最好的方法,但它确实有效。
开始了一个使用 Wagtail CMS 的项目,我对他们的主要页面的理解是它是分层的,这让我得出结论,页面要么是 parent/child 相关的,要么是兄弟的。
所以我的做法是让我的主页着陆,所有其他页面都是该页面的子页面。
这是我的结构
Home page
/ | \
News About us Events
/ | \ / | \
n_item n_item n_item e_item e_item e_item
所以它们是 6 种类型的页面
- 主页 *(唯一)
- 新闻 *(唯一)
- n_item(新闻)
- 关于我们 *(独一无二)
- 事件 *(唯一)
- e_item(活动项目)
然后我在上面列表中加星标的页面 (*) 的推广选项卡中勾选了 "Show in menus:"。
n_item 和 e_item 将允许编辑(非技术)人员根据需要添加任意数量的这些页面,因为它们将作为内容的一部分列在 "News" 和 "Events" 页。
理想情况下,编辑不应为主页、新闻、关于我们和活动创建同级。如果编辑不是超级用户,是否也可以限制编辑可以添加页面的 wagtails 功能?
但似乎没有明确简单的方法(也许是标签)来生成我的菜单。这是我在研究中发现的。
- page url and slug url 我似乎无法在每个未被该页面模板直接引用的模板中工作。这也意味着它不是那么动态
- django-simple-menu 对我来说似乎不是动态的,因为我必须在代码中手动 link 页。另外,如果 wagtail 打算这样做,那么在内部维护页面层次结构似乎是一种浪费。
- List item 似乎已被弃用,但即使不是,它看起来也很麻烦,原因与 1 和 2 相同
你见过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。 我想这不是最好的方法,但它确实有效。