Makina Blog

Le blog Makina-corpus

Wagtail : Utiliser le modèle Page ainsi que son Manager (partie 2)


Le modèle Page contient plusieurs méthodes spécifiques à l'outil Wagtail. C'est également le cas de son manager. Nous allons faire le tour de tout cela dans cet article.

Suite de la Première partie.

Manager et QuerySet

Il est premièrement important de comprendre une notion. Tous les types de contenus héritent de Page. Il est évidemment possible de ne récupérer qu'un type de contenu en utilisant le manager de ce type directement. Mais il est également possible de récupérer toutes les pages, quels que soit leur type, en utilisant le manager de Page :

BlogPage.objects.filter(slug="page")  # Retournera une QuerySet contenant des BlogPages
Page.objects.fitler(slug="page")  # Retournera une QuerySet contenant des Pages

Ainsi, en passant par le manager de Page, on ne récupèrera pas une instance de notre modèle spécifique mais bien de Page. Ce qui veut dire que nous n'auront pas accès aux attributs et méthodes spécifiques à notre modèle. Heureusement, Wagtail a tout prévu :

Page.objects.fitler(slug="page").specific()  # Retournera une instance des type de contenus plutôt que de Page.

Pour la suite de cette article, je n'utiliserai que le manager de Page, mais il est évidemment possible d'utiliser les mêmes méthodes sur les managers de vos types de contenus.

Je ne listerai ici que les méthodes que je pense importantes à connaitre (qui seront utiles dans 90% des cas), pour une liste exhaustive, je vous invite à consulter la documentation. Chaque méthode a une version inverse (not*), qui exclue les pages plutôt que de filtrer dessus. Chaque méthode retourne un QuerySet, ce qui permet d'enchaîner les appels.

live() / not_live()

live permet de filtrer le QuerySet pour ne contenir que les pages ayant été publiées. Nous verrons plus en détail le workflow proposé par Wagtail dans un prochain article.

descendant_of(page, inclusive=False) / not_descendant_of(page, inclusive=False)

Filtre le QuerySet pour ne contenir que les pages enfants, récursivement. Si inclusive est à True, le QuerySet contiendra également la page passée.

Page.objects.descendant_of(blog_index)  # Retournera tous les billets de blog

child_of(page) / not_child_of(page)

Filtre le QuerySet pour ne contenir que les pages directement enfants. Si inclusive est à True, le QuerySet contiendra également la page passée.

ancestor_of(page, inclusive=False) / not_ancestor_of(page, inclusive=False)

Filtre le QuerySet pour ne contenir que les pages ancêtres. C'est à dire le parent de la page courante, ainsi que son parent, etc. Si inclusive est à True, le QuerySet contiendra également la page passée.

parent_of(page) / not_parent_of(page)

Filtre le QuerySet pour ne contenir que la page parente de la page passée en paramètre.

sibling_of(page, inclusive=True) / not_sibling_of(page, inclusive=True)

Filtre le QuerySet pour ne contenir que les pages sœurs. Si inclusive est à True, le QuerySet contiendra également la page passée.

public() / not_public()

Filtre le QuerySet pour ne contenir que les pages qui ne sont pas dans une section privée.

type(model) / not_type(model)

Filtre le QuerySet pour ne contenir que les pages du type passé en paramètre.

Page.objects.type(BlogPage)  # Retournera tous les billets de blog

Manager personnalisé

Vous pouvez personnaliser les managers en héritant de la classe PageManager, ou en créant votre propre QuerySet en héritant de PageQuerySet et en utilisant la méthode from_queryset(). Voir la documentation pour plus d'informations.

Le modèle Page

Les instances de Page ont également quelques méthodes et attributs intéressants à connaître. Encore une fois, la liste exhaustive est présente dans la documentation.

specific

Retourne l'instance de la classe réelle de la page.

blog_index.specific()  # Retourne une instance de BlogIndex

specific_class

Retourne la classe réelle de la page.

blog_index.specific_class()  # Retourne BlogIndex

url

Retourne l'url relative de la page.

full_url

Retourne l'url absolue de la page.

get_ancestors(inclusive=False)

Retourne un QuerySet des ancêtres de la page. A le même effet que la méthode ancestor_of des QuerySet :

page.get_ancestors()
Page.objects.ancestor_of(page)

get_descendants(inclusive=False)

Retourne un QuerySet des descendants de la page. A le même effet que la méthode descendant_of des QuerySet :

page.get_descendants()
Page.objects.descendant_of(page)

get_siblings(inclusive=True)

Retourne un QuerySet des sœurs de la page. A le même effet que la méthode sibling_of des QuerySet :

page.get_siblings()
Page.objects.sibling_of(page)

Conclusion

Maintenant que vous savez manipuler les Pages, nous allons enfin pouvoir les afficher. Place aux templates dans la partie 3 !

Actualités en lien

Image
StreamField wagtail
15/06/2016

Wagtail : Comment écrire les templates (partie 3)

Il n'y a pas de vue à proprement parlé dans Wagtail. Tout est en fait géré dans le modèle. Nous pouvons ainsi modifier le template utilisé ou étendre son contexte en fonction du type de contenu sans problème.

Voir l'article
Image
ChooserPanel
13/06/2016

Wagtail : Créer ses modèles de type de contenu (partie 1)

On commence à avoir l'habitude d'initialiser son CMS directement depuis une interface web, cela incluant souvent de nombreux panneaux complexes. Wagtail reprend plutôt la philosophie Django et nous propose de définir les types de contenus comme des modèles.

Voir l'article
Image
back office
03/06/2016

Présentation de Wagtail, le dernier CMS Django

Wagtail est un CMS relativement récent dans l’écosystème Django. Pour autant, son jeune âge ne l’empêche pas de posséder de nombreuses fonctionnalités que nous découvrirons dans cet article.

Voir l'article

Inscription à la newsletter

Nous vous avons convaincus