Как создать невидимую фиктивную страницу в трясогузке?
Как я могу создать невидимую фиктивную страницу в 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
Если я создаю вышеуказанный объект страницы, он не отображается в сгенерированной карте сайта трясогузки.
Но если я сам перехожу на эту страницу вручную, объект вызывается. Как я могу это остановить?
Пример: если я создаю MenuDummyPage с заголовком "Это тест", то система автоматически сгенерирует slug => "this-is-a-test".
Если я вызываю "/this-is-a-test"/ в моем браузере, трясогузка отвечает, потому что пуля существует. Как я могу удалить это поведение для моих объектов "MenuDummyPage"?
1 ответ
Если под фиктивной страницей вы подразумеваете страницу, под которой другие страницы хранятся в дереве страниц, то вы можете сделать следующее:
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 этой страницы в своем шаблоне, пользователи никогда не должны знать, как получить URL для Node
, но если кто-то доберется до 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 %}