Gestionnaire de contenu permettant de créer et gérer un site internet basé sur le Système de design de l'État, accessible et responsive
Project description
wagtail_dsfr
Package Python pour Wagtail Dsfr, un gestionnaire de contenu permettant de créer et gérer un site internet basé sur le Système de design de l'État (DSFR), accessible et responsive.
Ce package est généré automatiquement à partir du projet Sites Faciles officiel.
Installation
pip install wagtail_dsfr
Ou avec poetry :
poetry add wagtail_dsfr
Utilisation
Ajoutez les applications à votre INSTALLED_APPS dans settings.py :
INSTALLED_APPS = [
# ... vos autres apps
"dsfr",
"wagtail_dsfr",
"wagtail_dsfr.blog",
"wagtail_dsfr.content_manager",
"wagtail_dsfr.events",
"wagtail.contrib.settings",
"wagtail.contrib.typed_table_block",
"wagtail.contrib.routable_page",
"wagtail_modeladmin",
"wagtailmenus",
"wagtailmarkdown",
]
Ajoutez les context processors nécessaires :
TEMPLATES[0]["OPTIONS"]["context_processors"].extend(
[
"wagtailmenus.context_processors.wagtailmenus",
"wagtail_dsfr.content_manager.context_processors.skiplinks",
"wagtail_dsfr.content_manager.context_processors.mega_menus",
]
)
Configurez les URLs dans votre urls.py :
# Option 1 : Utiliser directement la configuration d'URLs de wagtail_dsfr (recommandé)
from wagtail_dsfr.config.urls import *
# Option 2 : Configuration personnalisée
# Si vous avez besoin de personnaliser les URLs, vous pouvez copier le contenu
# de wagtail_dsfr.config.urls et l'adapter à vos besoins
Migration depuis Sites Faciles
Si vous migrez un site existant depuis le dépôt Sites Faciles vers ce package, vous devez mettre à jour les références ContentType dans votre base de données.
Étapes de migration
-
Installez le package comme décrit ci-dessus et ajoutez toutes les applications à
INSTALLED_APPS -
Exécutez les migrations Django pour créer les nouveaux ContentTypes :
python manage.py migrate
-
Migrez les ContentTypes existants :
python manage.py migrate_contenttype
Cette commande va :
- Identifier tous les ContentTypes de l'ancienne structure (blog, events, forms, content_manager, config)
- Mettre à jour toutes les pages Wagtail pour pointer vers les nouveaux ContentTypes
- Supprimer les anciens ContentTypes
-
Vérifiez la migration (optionnel - mode dry-run) :
python manage.py migrate_contenttype --dry-run
Pourquoi cette migration est nécessaire
Lorsque vous renommez des applications Django (par exemple de blog à wagtail_dsfr_blog), Django crée de nouveaux ContentTypes. Les pages Wagtail existantes référencent toujours les anciens ContentTypes, ce qui provoque l'erreur :
PageClassNotFoundError: The page 'xxx' cannot be edited because the model class
used to create it (blog.blogindexpage) can no longer be found in the codebase.
La commande migrate_contenttype résout ce problème en mettant à jour toutes les références.
Modèles de pages personnalisés
wagtail_dsfr utilise des modèles de pages configurables, similaires au système AUTH_USER_MODEL de Django ou WAGTAILIMAGES_IMAGE_MODEL de Wagtail.
Modèles par défaut
Par défaut, le package fournit les modèles concrets suivants :
wagtail_dsfr_blog.BlogIndexPagewagtail_dsfr_blog.BlogEntryPagewagtail_dsfr_events.EventsIndexPagewagtail_dsfr_events.EventEntryPagewagtail_dsfr_content_manager.ContentPage
Utilisation de modèles personnalisés
Si vous souhaitez personnaliser complètement ces modèles (par exemple, pour modifier les StreamField disponibles), vous pouvez créer vos propres modèles et les configurer via les settings Django.
Étape 1 : Créer vos modèles personnalisés
Par exemple, pour créer un modèle de blog personnalisé avec des blocs supplémentaires :
# myapp/models.py
from wagtail_dsfr.blog.models import BlogIndexPage as AbstractBlogIndexPage
from wagtail_dsfr.blog.models import BlogEntryPage as AbstractBlogEntryPage
from wagtail.fields import StreamField
from wagtail import blocks
# Définir vos blocs personnalisés
CUSTOM_BLOCKS = [
('heading', blocks.CharBlock(form_classname="title")),
('paragraph', blocks.RichTextBlock()),
('custom_block', MyCustomBlock()), # Votre bloc personnalisé
]
class CustomBlogIndexPage(AbstractBlogIndexPage):
# Vous pouvez ajouter des champs supplémentaires ici si nécessaire
class Meta:
verbose_name = "Index de blog personnalisé"
class CustomBlogEntryPage(AbstractBlogEntryPage):
# Surcharger le StreamField avec vos blocs personnalisés
body = StreamField(CUSTOM_BLOCKS, blank=True, use_json_field=True)
class Meta:
verbose_name = "Article de blog personnalisé"
Étape 2 : Configurer les settings
# settings.py
{package_name_upper}_BLOG_INDEX_MODEL = 'myapp.CustomBlogIndexPage'
{package_name_upper}_BLOG_ENTRY_MODEL = 'myapp.CustomBlogEntryPage'
{package_name_upper}_EVENTS_INDEX_MODEL = 'myapp.CustomEventsIndexPage'
{package_name_upper}_EVENTS_ENTRY_MODEL = 'myapp.CustomEventEntryPage'
{package_name_upper}_CONTENT_PAGE_MODEL = 'myapp.CustomContentPage'
Étape 3 : Créer et appliquer les migrations
python manage.py makemigrations
python manage.py migrate
Important : Cette configuration doit être faite avant de créer votre première page. Si vous avez déjà des pages existantes, vous devrez migrer les données.
Helper functions
Le package fournit des fonctions helpers pour obtenir les modèles configurés :
from wagtail_dsfr.utils.models import (
get_blog_index_model,
get_blog_entry_model,
get_events_index_model,
get_events_entry_model,
get_content_page_model,
)
# Obtenir le modèle configuré
BlogIndexPage = get_blog_index_model()
Créer des blocs personnalisés avec références de modèles
Le package fournit des blocs ChooserBlock qui utilisent automatiquement les modèles configurés. Cela vous permet de créer des blocs personnalisés qui référencent les bonnes pages, même si vous utilisez des modèles personnalisés.
Exemple : Bloc de mise en avant d'articles
# myapp/blocks.py
from wagtail import blocks
from wagtail_dsfr.content_manager.blocks.choosers import BlogIndexChooserBlock
class FeaturedArticlesBlock(blocks.StructBlock):
title = blocks.CharBlock(label="Titre de la section")
blog = BlogIndexChooserBlock(label="Blog source")
number_of_articles = blocks.IntegerBlock(
label="Nombre d'articles",
min_value=1,
max_value=10,
default=3
)
class Meta:
icon = "list-ul"
template = "blocks/featured_articles.html"
def get_context(self, value, parent_context=None):
context = super().get_context(value, parent_context)
blog = value.get('blog')
if blog:
# Le bloc utilisera automatiquement le bon modèle
context['articles'] = blog.posts[:value.get('number_of_articles', 3)]
return context
Blocs disponibles
Le package fournit les chooser blocks suivants :
BlogIndexChooserBlock- Pour sélectionner une page d'index de blogEventsIndexChooserBlock- Pour sélectionner une page d'index d'événements
Ces blocs s'adaptent automatiquement si vous configurez des modèles personnalisés via les settings.
Exemple d'utilisation dans un StreamField
# myapp/models.py
from wagtail.fields import StreamField
from wagtail import blocks
from wagtail_dsfr.content_manager.blocks.choosers import (
BlogIndexChooserBlock,
EventsIndexChooserBlock,
)
class MyCustomPage(Page):
body = StreamField([
('heading', blocks.CharBlock()),
('paragraph', blocks.RichTextBlock()),
('blog_reference', BlogIndexChooserBlock(label="Référence vers un blog")),
('events_reference', EventsIndexChooserBlock(label="Référence vers un calendrier")),
('featured_articles', FeaturedArticlesBlock()),
], blank=True, use_json_field=True)
Documentation
Pour plus d'informations sur l'utilisation de Sites Faciles, consultez la documentation officielle.
Licence
Ce projet est sous licence MIT - voir le fichier LICENSE pour plus de détails.
Crédits
Ce package est basé sur Sites Faciles développé par la DINUM.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file wagtail_dsfr-2.3.0rc1.tar.gz.
File metadata
- Download URL: wagtail_dsfr-2.3.0rc1.tar.gz
- Upload date:
- Size: 2.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc0b4e797a4ef7a09c0c9f6f8afcd7908da6349a115271dda09a0dfd72d78f76
|
|
| MD5 |
165640baba86eeccfc7e547da01777ee
|
|
| BLAKE2b-256 |
193bbdbf1c2ab12e8890ffb43c6f8d18672321121a016f756cb914dd52341574
|
Provenance
The following attestation bundles were made for wagtail_dsfr-2.3.0rc1.tar.gz:
Publisher:
publish.yml on fabienheureux/paquet-facile
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wagtail_dsfr-2.3.0rc1.tar.gz -
Subject digest:
dc0b4e797a4ef7a09c0c9f6f8afcd7908da6349a115271dda09a0dfd72d78f76 - Sigstore transparency entry: 728411917
- Sigstore integration time:
-
Permalink:
fabienheureux/paquet-facile@94ce84db7d7d57609430aa330e26757a7205fc67 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/fabienheureux
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@94ce84db7d7d57609430aa330e26757a7205fc67 -
Trigger Event:
push
-
Statement type:
File details
Details for the file wagtail_dsfr-2.3.0rc1-py3-none-any.whl.
File metadata
- Download URL: wagtail_dsfr-2.3.0rc1-py3-none-any.whl
- Upload date:
- Size: 2.3 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db372aa4c30a74f23e31ed744a82526698df0f967d8da0949575d116f5a93f9b
|
|
| MD5 |
feb56d6f9c4ecc84cb972ab4120c86a4
|
|
| BLAKE2b-256 |
f5c5fe85641335430cb58fcbf02a6f9eefd200fa8512916db9118b031e064e6e
|
Provenance
The following attestation bundles were made for wagtail_dsfr-2.3.0rc1-py3-none-any.whl:
Publisher:
publish.yml on fabienheureux/paquet-facile
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wagtail_dsfr-2.3.0rc1-py3-none-any.whl -
Subject digest:
db372aa4c30a74f23e31ed744a82526698df0f967d8da0949575d116f5a93f9b - Sigstore transparency entry: 728411929
- Sigstore integration time:
-
Permalink:
fabienheureux/paquet-facile@94ce84db7d7d57609430aa330e26757a7205fc67 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/fabienheureux
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@94ce84db7d7d57609430aa330e26757a7205fc67 -
Trigger Event:
push
-
Statement type: