Трясогузка: рендеринг дочерних элементов с другой страницы - PullRequest
0 голосов
/ 12 ноября 2019

Обычно при рендеринге дочерних элементов на странице я использую {% for item in page.get_children %} и отображаю их как {{ item.specific.name }}

Однако я хочу теперь получить доступ к дочерним элементам со страницы, которая не находится в ее собственном шаблоне,(например, рендеринг дочерних элементов из /about.html в /home.html)

Я предполагаю, что это что-то вроде {% for item in page.pagename.get_children %}, хотя я не уверен в фактическом имени страницы ... Должен ли я определить этогде-то / это определено где-то?

Ответы [ 3 ]

1 голос
/ 12 ноября 2019

Вы можете добавить к контексту страницы, на которой вы выполняете рендеринг, переменную контекста для страницы, чьи дочерние элементы вы хотите отобразить:

class HomePage(Page):
    def get_context(self, request):
        context = super().get_context(request)
        context['about_page'] = Page.objects.get(slug='about')
        return context

Тогда в home.html вы сделаете:

{% for item in about_page.get_children.live.in_menu %}

(используйте .live и .in_menu, если вы хотите, чтобы страницы соответствовали этим критериям.)

1 голос
/ 12 ноября 2019

Во-первых, я бы порекомендовал выполнять выборку вашей страницы в методе get_context , чтобы вы могли свободно использовать методы ORM Django, а не только те, которые можно записать в шаблоне. В частности, вы можете использовать Page.objects.get(...) для извлечения конкретной страницы на основе заголовка (или любого другого критерия):

class HomePage(Page):
    # ...
    def get_context(self, request):
        context = super().get_context(request)
        context['about_pages'] = Page.objects.get(title='About').get_children()
        return context

Это позволит вам написать {% for item in about_pages %} в вашем шаблоне.

Если вы не можете полагаться на то, что заголовок страницы будет предсказуемым, например «О программе», вам придется решить, какой другой критерий определяет его как «О странице». Обычные подходы заключаются в том, чтобы использовать слаг (Page.objects.get(slug='about')), который с меньшей вероятностью будет изменен случайно, или определить выделенный тип страницы AboutPage и выборку на основе этого: AboutPage.objects.first().

0 голосов
/ 12 ноября 2019

Разобрался, я оставлю это здесь, если кто-нибудь еще наткнется на эту тему.

на странице / model.py

casestudy_root = models.ForeignKey( # Page Navigation
    'wagtailcore.Page',
    on_delete=models.PROTECT,
    related_name='+',
    null=True,
    blank=True,
)

 content_panels = Page.content_panels + [
        PageChooserPanel('casestudy_root', 'content.CaseStudyIndexPage'),
    ]

Для html

{% for casestudy in page.casestudy_root.get_children %}

После внесения изменений запустите python manage.py makemigrations, а затем python manage.py migrate

Не забудьте выбрать страницу в панели администратора

...