0
votes

Bergeronnette: rendu des éléments enfants à partir d'une page différente

Normalement, lors du rendu des éléments enfants sur la page, j'utilise {% pour l'élément dans page.get_children%} et les restituer comme {{item.specific.name}}

Cependant, je souhaite maintenant accéder aux éléments enfants à partir d'une page qui ne se trouve pas dans son propre modèle. (par exemple, rendre les éléments enfants de /about.html vers /home.html)

J'imagine que c'est quelque chose comme {% pour l'élément dans page.pagename.get_children%} bien que je ne sois pas sûr du nom réel de la page ... Dois-je le définir quelque part / est il a défini quelque part?


0 commentaires

3 Réponses :


1
votes

Premièrement, je vous recommande de récupérer votre page dans un get_context méthode , afin que vous puissiez utiliser les méthodes ORM de Django librement, plutôt que simplement celles qui peuvent être écrites dans un modèle. En particulier, vous pouvez utiliser Page.objects.get (...) pour récupérer une page particulière en fonction du titre (ou de tout autre critère):

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

Ceci vous permettra d'écrire {% pour l'élément dans about_pages%} sur votre modèle.

Si vous ne pouvez pas compter sur le titre de la page pour être un titre prévisible tel que "À propos ", vous devrez alors décider quel autre critère l'identifie comme" la page À propos de ". Les approches courantes consisteraient à utiliser le slug ( Page.objects.get (slug = 'about') ), qui est un peu moins susceptible d'être modifié par accident - ou à définir un dédié AboutPage type de page et extraction en fonction de cela: AboutPage.objects.first().


0 commentaires

1
votes

Vous pouvez ajouter au contexte de la page où vous effectuez le rendu une variable de contexte pour la page dont vous voulez rendre les enfants:

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

Puis dans home.html vous feriez:

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

(Utilisez .live et .in_menu si vous ne voulez que des pages qui répondre à ces critères.)


0 commentaires

0
votes

J'ai compris, je laisserai ceci ici au cas où quelqu'un d'autre tomberait sur ce fil.

sur la page / model.py

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

Pour le html p >

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'),
    ]

Après les modifications, exécutez python manage.py makemigrations suivi de python manage.py migrate

N'oubliez pas de sélectionner la page dans le panneau d'administration


0 commentaires