如何在 Wagtail 中创建一个不可见的虚拟页面?
How to create an invisible dummy page in Wagtail?
如何在 Wagtail 中创建一个不可见的虚拟页面?
我需要 Wagtail 中的 "virtual" 页面 object 来为非基于 Wagtail 的页面和外部资源构建菜单。 (看我的条目post)
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
如果我创建上面的页面 object 那么它不会在生成的 wagtail 站点地图中列出。
但如果我自己手动导航到该页面,则会调用 object。我该如何阻止它?
示例:
如果我创建一个标题为 "This is a test" 的 MenuDummyPage,那么系统将自动生成一个 slug => "this-is-a-test".
如果我在我的浏览器中调用“/this-is-a-test”/,wagtail 正在应答,因为 slug 存在。如何为我的 "MenuDummyPage" object 删除此行为?
如果您所说的虚拟页面是指页面树中其他页面位于其下的页面,那么您可以执行以下操作:
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
字段允许您定义一个 link 如果您希望在页面树结构中的这个位置。上面再次假设您正在使用这个基于 Page
的项目作为 Page
树中的占位符,以便您可以在其下放置其他 Page
。只要您不在模板中呈现此页面的 url,用户就永远不会知道如何为 Node
访问 url,但如果有人访问url 对于 Node
类型的页面,然后 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 %}
如何在 Wagtail 中创建一个不可见的虚拟页面?
我需要 Wagtail 中的 "virtual" 页面 object 来为非基于 Wagtail 的页面和外部资源构建菜单。 (看我的条目post
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
如果我创建上面的页面 object 那么它不会在生成的 wagtail 站点地图中列出。
但如果我自己手动导航到该页面,则会调用 object。我该如何阻止它?
示例: 如果我创建一个标题为 "This is a test" 的 MenuDummyPage,那么系统将自动生成一个 slug => "this-is-a-test".
如果我在我的浏览器中调用“/this-is-a-test”/,wagtail 正在应答,因为 slug 存在。如何为我的 "MenuDummyPage" object 删除此行为?
如果您所说的虚拟页面是指页面树中其他页面位于其下的页面,那么您可以执行以下操作:
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
字段允许您定义一个 link 如果您希望在页面树结构中的这个位置。上面再次假设您正在使用这个基于 Page
的项目作为 Page
树中的占位符,以便您可以在其下放置其他 Page
。只要您不在模板中呈现此页面的 url,用户就永远不会知道如何为 Node
访问 url,但如果有人访问url 对于 Node
类型的页面,然后 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 %}