Как создать невидимую фиктивную страницу в трясогузке? - PullRequest
1 голос
/ 10 июля 2019

Как я могу создать невидимую фиктивную страницу в 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 Ответ

2 голосов
/ 10 июля 2019

Если под фиктивной страницей подразумевается страница, на которой другие страницы хранятся в дереве страниц, вы можете сделать следующее:

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 %}
...