[Django] 14 - Custom Menu System of Wagtail

基本知识点

 

二、更多资源

Goto: rkhleics/wagtailmenus

 

 

 

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.

posted @ 2020-12-30 21:02  郝壹贰叁  阅读(136)  评论(0编辑  收藏  举报