Makina Blog
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
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.
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.
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.