1
0
Laurent Hazart 3 долоо хоног өмнө
parent
commit
a6e34188bc

+ 2 - 1
core/models.py

@@ -4,6 +4,7 @@ from django import forms
 from django.template.defaultfilters import slugify
 
 from tinymce.widgets import TinyMCE  # Réactivé
+from core.storage.backends import StaticStorage
 
 menu_pos = (
 	(u'no', u'No'),
@@ -72,7 +73,7 @@ class Data (models.Model) : #stocage de donnée dynamique
 class Fichier (models.Model) : # Upload de fichier pour réutilisation dans les pages
 	f_nom = models.CharField("Nom du fichier", max_length = 128, blank = True, editable = False)
 	f_date = models.DateTimeField("Date", auto_now_add=True)
-	f_fichier = models.FileField("Fichier", upload_to='static/uploads/')
+	f_fichier = models.FileField("Fichier", upload_to='uploads/', storage=StaticStorage())
 
 	class Meta :
 		verbose_name = 'Stocage de fichiers'

+ 1 - 0
core/storage/__init__.py

@@ -0,0 +1 @@
+# Storage personnalisé pour les fichiers uploadés

+ 13 - 0
core/storage/backends.py

@@ -0,0 +1,13 @@
+from django.core.files.storage import FileSystemStorage
+from django.conf import settings
+import os
+
+class StaticStorage(FileSystemStorage):
+    """
+    Storage personnalisé pour sauvegarder les fichiers dans le dossier static
+    au lieu du dossier media (pour compatibilité avec les liens historiques)
+    """
+    def __init__(self, *args, **kwargs):
+        kwargs['location'] = os.path.join(settings.BASE_DIR, 'static')
+        kwargs['base_url'] = '/static/'
+        super().__init__(*args, **kwargs)

+ 75 - 0
docs/SOLUTION_STORAGE_FICHIERS.md

@@ -0,0 +1,75 @@
+# Solution pour le stockage des fichiers dans static/uploads/
+
+## Problème
+Les fichiers uploadés via le modèle `Fichier` étaient sauvegardés dans `media/static/uploads/` 
+au lieu de `static/uploads/`, car Django ajoute automatiquement `MEDIA_ROOT` devant le chemin.
+
+## Solution implémentée
+Création d'un **custom storage** qui sauvegarde directement dans `static/uploads/` sans 
+utiliser `MEDIA_ROOT`.
+
+## Fichiers modifiés/créés
+
+### 1. Nouveau storage personnalisé
+**Fichier:** `core/storage/backends.py`
+- Storage qui pointe vers le dossier `static/` au lieu de `media/`
+- Génère automatiquement les URLs avec `/static/` comme base
+
+### 2. Modèle Fichier mis à jour
+**Fichier:** `core/models.py`
+- Import du `StaticStorage`
+- Modification du champ `f_fichier` pour utiliser le storage personnalisé
+
+```python
+f_fichier = models.FileField("Fichier", upload_to='uploads/', storage=StaticStorage())
+```
+
+## Résultat
+- ✅ Les nouveaux fichiers uploadés iront dans `static/uploads/`
+- ✅ Les URLs générées seront `/static/uploads/nom_fichier`
+- ✅ Compatible avec vos liens historiques dans les articles
+- ✅ Pas besoin de modifier les liens existants
+
+## Migration
+
+### Si Django n'est pas installé localement
+Vous devrez faire la migration sur votre serveur de production ou dans votre environnement 
+avec Django installé :
+
+```bash
+python3 manage.py makemigrations core
+python3 manage.py migrate core
+```
+
+### Si vous utilisez Docker
+```bash
+docker-compose exec web python manage.py makemigrations core
+docker-compose exec web python manage.py migrate core
+```
+
+## Test
+Pour tester que le storage fonctionne, exécutez :
+```bash
+python3 test_storage.py
+```
+
+## Notes importantes
+1. Les **anciens fichiers** dans `media/static/uploads/` resteront là où ils sont
+2. Les **nouveaux fichiers** iront directement dans `static/uploads/`
+3. Vous pourrez déplacer manuellement les anciens fichiers si nécessaire :
+   ```bash
+   mv media/static/uploads/* static/uploads/
+   ```
+
+## Avantages de cette solution
+- ✅ Préserve les liens historiques
+- ✅ Solution propre avec un storage personnalisé
+- ✅ Facile à maintenir
+- ✅ Compatible avec collectstatic (les fichiers restent dans static/)
+
+## Alternative (si besoin)
+Si vous voulez que Django gère les fichiers via MEDIA au lieu de STATIC (recommandé pour 
+la production), vous devrez :
+1. Utiliser le MEDIA_ROOT standard
+2. Créer un script de remplacement dans vos articles pour changer `/static/uploads/` 
+   en `/media/uploads/`

+ 37 - 0
test_storage.py

@@ -0,0 +1,37 @@
+#!/usr/bin/env python3
+"""
+Script de test pour vérifier le storage personnalisé
+"""
+import sys
+import os
+
+# Ajouter le répertoire du projet au PYTHONPATH
+sys.path.insert(0, '/Users/duhaz/projets/blog-duhaz')
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'duhaz_blog.settings')
+
+try:
+    import django
+    django.setup()
+    
+    from core.storage.backends import StaticStorage
+    
+    # Test du storage
+    storage = StaticStorage()
+    print(f"✓ Storage location: {storage.location}")
+    print(f"✓ Storage base_url: {storage.base_url}")
+    print(f"✓ Chemin complet pour 'uploads/test.txt': {storage.path('uploads/test.txt')}")
+    print(f"✓ URL pour 'uploads/test.txt': {storage.url('uploads/test.txt')}")
+    print("\n✅ Le storage personnalisé fonctionne correctement!")
+    print(f"   Les fichiers seront sauvegardés dans: {storage.location}/uploads/")
+    print(f"   Et seront accessibles via: {storage.base_url}uploads/")
+    
+except ImportError as e:
+    print(f"❌ Erreur d'import: {e}")
+    print("\nPour installer Django, créez un environnement virtuel:")
+    print("  python3 -m venv venv")
+    print("  source venv/bin/activate")
+    print("  pip install -r requirements.txt")
+except Exception as e:
+    print(f"❌ Erreur: {e}")
+    import traceback
+    traceback.print_exc()