2

如何在 Wagtail 中创建一个不可见的虚拟页面?

我需要 Wagtail 中的“虚拟”页面对象来为非 Wagtail 页面和外部资源构建菜单。(在这里查看我的条目)

class MenuDummyPage(Page):

    menu_description    = models.CharField(max_length=255, blank=True)
    menu_icon           = models.CharField(max_length=255, blank=True)
    menu_link           = models.CharField(max_length=255, blank=True)

    settings_panels = [
        FieldPanel('menu_description'),
        FieldPanel('menu_icon'),
        FieldPanel('menu_link'),
    ]

    def get_sitemap_urls(self):
        return []

    def serve(self, request):
        pass

如果我创建了上面的页面对象,那么它不会在生成的 wagtail 站点地图中列出。

但是,如果我自己手动导航到该页面,则会调用该对象。我怎样才能阻止这个?

示例:如果我创建一个标题为“This is a test”的 MenuDummyPage,那么系统将自动生成一个 slug =>“this-is-a-test”。

如果我在浏览器中调用“/this-is-a-test”/,则 wagtail 正在回答,因为存在蛞蝓。如何删除我的“MenuDummyPage”对象的这种行为?

4

1 回答 1

3

如果您所说的虚拟页面是指在页面树中保留其他页面的页面,那么您可以执行以下操作:

from django.http import HttpResponseRedirect

class Node(Page):

    subpage_types = [your subpage types]
    parent_page_types = [your parent page types]

    link = models.CharField(max_length=255, default='', blank='True')

    content_panels = Page.content_panels + [
        FieldPanel('link')
    ]  

    def serve(self, request):
        if self.link is not None:
            return HttpResponseRedirect(self.link)
        # To handle the situation where someone inadvertantly lands on a parent page, do a redirect
        first_descendant = self.get_descendants().first()
        if first_descendant:
            return HttpResponseRedirect(first_descendant.url)
        else:
            return HttpResponseRedirect(request.site.root_page.url)

如果您希望在页面树结构中的此位置,可选link字段允许您定义链接。上面再次假设您正在使用Page基于此的项目作为Page树中的占位符,以便您可以Page在其下放置其他 s。只要您不在模板中呈现此页面的 url,那么用户就永远不知道如何获取 的 url Node,但是如果有人确实获取了Node-type 页面的 url,那么first_descendant逻辑会处理这个如果不存在的后代,则将它们发送到 的第一个后代Node或主页Node

在您的模板中(注意使用specific_class):

{% for item in menu_items %}
    <li>
        <a href="{% if item.specific.link and item.specific.link != '' %}{{ item.specific.link }}{% elif item.specific_class == 'Node'%}#{% else %}{% pageurl item %}{% endif %}">{{ item.title }
        </a>
    </li>
{% endfor %}
于 2019-07-10T14:45:49.963 回答