blog/seo_helpers.py)SEOMetadata pour gérer automatiquement les métadonnéesblog/templates/blog/seo_meta.htmlTemplate réutilisable pour toutes les métadonnées SEO :
blog/templates/blog/breadcrumbs.htmlFil d'Ariane avec Schema.org BreadcrumbList :
blog/views.py)SEOMetadata dans blog_index() et blog_play()prefetch_related()blog_update() (accès staff uniquement)Modifier core/templates/base.html pour remplacer les anciennes métadonnées par :
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- SEO: Inclure les métadonnées enrichies -->
{% if page.seo %}
{% include 'blog/seo_meta.html' with seo=page.seo %}
{% else %}
<!-- Métadonnées par défaut si pas de SEO -->
<meta name="description" content="{% if page.p_description %}{{page.p_description}}{% endif %}">
<meta name="keywords" content="{% if page.p_mots_clefs %}{{page.p_mots_clefs}}{% endif %}">
<meta name="author" content="Mr Duhaz">
{% endif %}
<title>{{page.c_sitename}}{% if page.p_meta_title %} | {{page.p_meta_title}}{% elif page.p_titre %} | {{page.p_titre}}{% endif %}</title>
<!-- ... reste du head ... -->
</head>
listing.html (après {% block main %}):{% block main %}
{% if page.breadcrumbs %}
{% include 'blog/breadcrumbs.html' with breadcrumbs=page.breadcrumbs %}
{% endif %}
<!-- Reste du contenu -->
read.html (après {% block main %}):{% block main %}
{% if page.breadcrumbs %}
{% include 'blog/breadcrumbs.html' with breadcrumbs=page.breadcrumbs %}
{% endif %}
<div class="card-body">
<!-- Reste du contenu -->
Ajouter des champs SEO dédiés au modèle Blog :
class Blog(models.Model):
# ... champs existants ...
# Nouveaux champs SEO (optionnels)
seo_title = models.CharField("Titre SEO", max_length=70, blank=True,
help_text="Titre optimisé pour le SEO (60-70 caractères)")
seo_description = models.CharField("Description SEO", max_length=160, blank=True,
help_text="Description optimisée pour le SEO (150-160 caractères)")
seo_image = models.URLField("Image SEO", max_length=256, blank=True,
help_text="URL de l'image pour les réseaux sociaux (1200x630px recommandé)")
Puis exécuter :
python manage.py makemigrations
python manage.py migrate
Le fichier blog/sitemaps.py est déjà bon, vérifier qu'il est bien enregistré dans urls.py :
from django.contrib.sitemaps.views import sitemap
from blog.sitemaps import BlogSitemap, CategorySitemap, PageSitemap, StaticViewSitemap
sitemaps = {
'blog': BlogSitemap,
'categories': CategorySitemap,
'pages': PageSitemap,
'static': StaticViewSitemap,
}
urlpatterns = [
# ... autres URLs ...
path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
]
Le fichier static/robots.txt est correct :
User-agent: *
Disallow:
Disallow: /admin/
Sitemap: https://www.duhaz.fr/sitemap.xml
✅ Open Graph complet (partage Facebook optimisé) ✅ Twitter Cards (partage Twitter optimisé) ✅ Schema.org JSON-LD (données structurées pour Google) ✅ URL canoniques (évite le duplicate content)
✅ Fil d'Ariane clair (navigation + SEO) ✅ Descriptions optimisées automatiquement ✅ Métadonnées cohérentes sur toutes les pages
✅ Requêtes optimisées avec prefetch_related()
✅ Descriptions tronquées intelligemment
✅ Génération automatique des métadonnées
Vos articles pourront apparaître avec :
Vérifier dans le code source HTML que les balises sont présentes :
# Lancer le serveur
python manage.py runserver
# Visiter http://localhost:8000/blog/
# Faire clic droit > "Afficher le code source"
# Vérifier la présence de : og:, twitter:, schema.org
<img loading="lazy">Dans settings.py, activer les paramètres de sécurité :
# En production uniquement
if not DEBUG:
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
X_FRAME_OPTIONS = 'DENY'
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
page.seo est bien défini dans la vueblog/seo_meta.html est accessibleAprès implémentation complète, vos articles auront :
✅ Rich Snippets dans Google
✅ Partages sociaux optimisés
✅ Meilleur référencement
✅ Meilleure expérience utilisateur
Créé le : 31 octobre 2025
Auteur : Claude (Assistant IA)
Projet : Blog Duhaz - Amélioration SEO Django