Sèkun blog

Ajouter une action sur un type de page uniquement avec wagtail

Sekun 15/04/2021, 15:26:00

Wagtail permet de customiser à souhait son interface, il est possible de rajouter une action sur un type de page spécifique.

Menu déroulant avec «Modifier le stage» apparaissant

On suppose qu'on dispose du modèle EventPage, héritant de Page:

# models.py
from wagtail.core.models import Page

class EventPage(Page):
pass

Pour rajouter une action, celle-ci s'encode dans le fichier wagtail_hooks.py.

On crée une classe héritant de ActionMenuItem, et qui renverra une url.

# wagtail_hooks.py
from django.shortcuts import redirect
from wagtail.admin.action_menu import ActionMenuItem
class ShowEvent(ActionMenuItem):
name = "show-event"
label = _("Modifier le stage")
icon_name = "edit"

def get_url(self, request, context):
return redirect("my_url_name")

Définir le classe ne suffit pas, il faut la rajouter à la liste des action_menu:

# wagtail_hooks.py
from wagtail.core import hooks
@hooks.register("register_page_action_menu_item")
def register_show_event_menu_item():
return ShowEvent(order=10)

Le problème est que l'action apparaît sur toutes les pages, on va modifier ce comportement via le hooks construct_page_action_menu: on filtre la liste de menu_items, on n'affiche que ceux dont le nom n'est pas show-event, qui est le nom de notre classe ShowEvent définie plus haut.

# wagtail_hooks.py
@hooks.register("construct_page_action_menu")
from .models import EventPage
def show_event_only_on_event_page(menu_items, request, context):
page = context.get("page")
if not isinstance(page, EventPage):
menu_items[:] = [item for item in menu_items if item.name != "show-event"]