Accueil / Blog / Métier / 2016 / Wagtail : Utiliser le modèle Page ainsi que son Manager (partie 2)

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

Par Yann Fouillat — publié 12/07/2016, édité le 19/07/2016
Contributeurs : Yannick Chabbert
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.
Wagtail : Utiliser le modèle Page ainsi que son Manager (partie 2)

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 !

ABONNEZ-VOUS À LA NEWSLETTER !
Voir aussi
Django Rest Framework : les tests (partie 8) Django Rest Framework : les tests (partie 8) 22/02/2016

Avec les API REST, développer très rapidement des tests fonctionnels complets qui frôlent les ...

Formation Django initiation à Toulouse du 13 au 15 mars Formation Django initiation à Toulouse du 13 au 15 mars 26/01/2017

Entrez de plain-pied dans l'univers de Django aux côtés de développeurs ayant une expérience de ...

Python : Bien configurer son environnement de développement Python : Bien configurer son environnement de développement 07/12/2015

Comment utiliser les bonnes pratiques de développement Python.

Internationalisation avec Django Internationalisation avec Django 27/11/2018

En tant que développeurs nous sommes parfois confronté à la problématique de l'accessibilité ...

Retour sur la PyConFr 2016 Retour sur la PyConFr 2016 18/10/2016

Nous étions présents à Rennes pour PyConFr 2016. Voici notre compte-rendu à chaud.