如何在Wa中创建不可见的伪页面?

时间:2019-07-10 14:12:27

标签: wagtail invisible wagtail-pageurl

如何在Wa中创建不可见的虚拟页面?

我需要Wagtail中的“虚拟”页面对象来为非基于Wagtail的页面以及外部资源构建菜单。 (请参阅我的帖子here

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” /,则ag会回答,因为该子弹存在。如何为我的“ MenuDummyPage”对象删除此行为?

1 个答案:

答案 0 :(得分:2)

如果虚拟页面的意思是页面树中保留了其他页面的页面,则可以执行以下操作:

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。只要您没有在模板中呈现此页面的URL,用户就永远不会知道如何获取Node的URL,但是如果有人确实获取了{{1}的URL }类型的页面,然后Node逻辑通过将它们发送到first_descendant的第一个后代或如果没有Node的后代发送到主页来处理这种情况。

在模板中(请注意使用specific_class

Node