[Django] 14 - Custom Menu System of Wagtail
基本知识点
一、Orderables
二、更多资源
snippet 定义
一、加载模型
base.html 文件
{% load static wagtailuserbar menus_tags %}
{% get_menu "main" as navigation %}
定义逐个击破如下。
-
menus_tags 文件
单独新建文件夹 templatetags,创建将要加载的“py文件”,这是套路。
from django import template from ..models import Menu register = template.Library() @register.simple_tag() # <---- def get_menu(slug): try: return Menu.objects.get(slug=slug) # <---- except Menu.DoesNotExist: return Menu.objects.none()
[ model 代码片段 ]
定义好 menu items。
# 之前使用的是“函数注册”,这里使用装饰器也等价。 @register_snippet class Menu(ClusterableModel): """The main menu clusterable model.""" title = models.CharField(max_length=100) # slug = AutoSlugField(populate_from="title", editable=True) slug = models.SlugField() panels = [ MultiFieldPanel([ FieldPanel("title"), FieldPanel("slug"), ], heading="Menu"), InlinePanel("menu_items", label="Menu Item") # ----> ] def __str__(self): return self.title
[ @register.simple_tag() ]
Ref: Django的register.simple_tag简单使用
简而言之,模板需要一个函数,这个函数在 ./templatetags 目录下创建的 .py中定义好。
get_menu()提供了 link group (MENU) 中的所有 menu items。
-
定义 “main”
必须与 template 中的这段代码保持一致。
二、模板更新
进行同步改进。
-
过去
<li class="nav-item"> <a class="nav-link" href="/blog/">Blog</a> </li> <li class="nav-item"> <a class="nav-link" href="/about/">About</a> </li>
-
现在
{% for item in navigation.menu_items.all %} <li> <a href="{{ item.link }}" class="nav-link"{% if item.open_in_new_tab %} target="_blank"{% endif %}>{{ item.title }}</a> </li> {% endfor %}
link到底取自那个控件value,这是另一种解决方案。
类似地,在 ButtonBlock 也有相似解决方案。
Goto: [Django] 08 - StreamField of Wagtail 【另一个例子】
@property def link(self): if self.link_page: return self.link_page.url elif self.link_url: return self.link_url return '#' @property def title(self): if self.link_page and not self.link_title: return self.link_page.title elif self.link_title: return self.link_title return 'Missing Title'
End.