Переглянути джерело

CORRECTIONS_ERREURS_SITEMAP

Laurent Hazart 2 тижнів тому
батько
коміт
d50f76f20a

+ 4 - 2
blog/sitemaps.py

@@ -28,7 +28,8 @@ class CategorySitemap(Sitemap):
     protocol = 'https'
 
     def items(self):
-        return Cat_Blog.objects.all()
+        # IMPORTANT : Ordonner le QuerySet pour éviter le warning de pagination
+        return Cat_Blog.objects.all().order_by('cb_titre')
     
     def lastmod(self, obj):
         # Utilise la date du dernier article publié dans cette catégorie
@@ -53,7 +54,8 @@ class PageSitemap(Sitemap):
     protocol = 'https'
 
     def items(self):
-        return Page.objects.filter(p_publier=True, p_type='page')
+        # IMPORTANT : Ordonner le QuerySet pour éviter le warning de pagination
+        return Page.objects.filter(p_publier=True, p_type='page').order_by('p_adresse')
     
     def lastmod(self, obj):
         # Si la page a un champ de date de modification, l'utiliser

+ 106 - 0
docs/seo/CORRECTIONS_ERREURS_SITEMAP.md

@@ -0,0 +1,106 @@
+# Correction des erreurs de génération du sitemap
+
+## 🐛 Problèmes identifiés
+
+### Problème 1 : ContentNotRenderedError
+```
+django.template.response.ContentNotRenderedError: 
+The response content must be rendered before it can be accessed.
+```
+
+**Cause :** La réponse Django doit être rendue avant de pouvoir accéder à son contenu.
+
+**Solution :** Appeler `response.render()` avant d'accéder à `response.content`
+
+### Problème 2 : UnorderedObjectListWarning
+```
+UnorderedObjectListWarning: Pagination may yield inconsistent results 
+with an unordered object_list: <class 'blog.models.Cat_Blog'> QuerySet.
+```
+
+**Cause :** Les QuerySets utilisés dans le sitemap doivent être ordonnés pour la pagination.
+
+**Solution :** Ajouter `.order_by()` à tous les QuerySets
+
+## ✅ Corrections appliquées
+
+### 1. Fichier : `scripts/generate_sitemap_preview.py`
+
+**Avant :**
+```python
+response = views.sitemap(request, sitemaps)
+with open(output_file, 'wb') as f:
+    f.write(response.content)  # ❌ Erreur ici
+```
+
+**Après :**
+```python
+response = views.sitemap(request, sitemaps)
+response.render()  # ✅ Rendre avant d'accéder au contenu
+with open(output_file, 'wb') as f:
+    f.write(response.content)
+```
+
+### 2. Fichier : `blog/sitemaps.py`
+
+**CategorySitemap - Avant :**
+```python
+def items(self):
+    return Cat_Blog.objects.all()  # ❌ Non ordonné
+```
+
+**CategorySitemap - Après :**
+```python
+def items(self):
+    return Cat_Blog.objects.all().order_by('cb_titre')  # ✅ Ordonné
+```
+
+**PageSitemap - Avant :**
+```python
+def items(self):
+    return Page.objects.filter(p_publier=True, p_type='page')  # ❌ Non ordonné
+```
+
+**PageSitemap - Après :**
+```python
+def items(self):
+    return Page.objects.filter(
+        p_publier=True, 
+        p_type='page'
+    ).order_by('p_adresse')  # ✅ Ordonné
+```
+
+## 🧪 Test
+
+Après correction, tester avec :
+
+```bash
+python scripts/generate_sitemap_preview.py
+```
+
+Le script devrait maintenant :
+- ✅ Générer le sitemap sans erreur
+- ✅ Créer le fichier `static/sitemap_preview.xml`
+- ✅ Afficher les statistiques
+
+## 📊 Résumé des fichiers modifiés
+
+1. **`scripts/generate_sitemap_preview.py`** - Ajout de `response.render()`
+2. **`blog/sitemaps.py`** - Ajout de `.order_by()` dans 2 classes
+
+## ⚠️ Note importante
+
+Ces corrections sont **nécessaires pour le bon fonctionnement** du sitemap en production. Sans elles :
+- Le sitemap pourrait ne pas se générer correctement
+- Les warnings pourraient polluer les logs
+- La pagination pourrait être inconsistante
+
+## 🚀 Prochaines étapes
+
+1. Tester la génération du sitemap
+2. Vérifier que le sitemap en ligne contient bien des URLs
+3. Si le sitemap est encore vide, exécuter `python scripts/fix_sitemap_sites.py`
+
+---
+
+**Ces corrections font partie de la résolution complète des problèmes SEO.**

+ 3 - 0
scripts/generate_sitemap_preview.py

@@ -44,6 +44,9 @@ def generate_sitemap_preview():
         # Générer le sitemap
         response = views.sitemap(request, sitemaps)
         
+        # IMPORTANT : Rendre la réponse avant d'accéder au contenu
+        response.render()
+        
         # Sauvegarder dans un fichier de preview
         output_file = Path(__file__).parent.parent / 'static' / 'sitemap_preview.xml'