Habituellement, j'ai ce problème exactement dans l'autre sens!
Dans mon environnement de développement, mon application Django ne chargera pas certains de mes fichiers statiques, en particulier ceux que j'ai ajoutés moi-même: c'est-à-dire les deux packages que j'ai ajoutés à mon application ( admin
et ckeditor
) se chargent tous les deux correctement, mais deux des dossiers que j'ai créés et liés moi-même ( img
et css
) ne sont pas trouvés. Voici une carte de mon répertoire:
from django.contrib import admin from django.urls import path, include from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('', include('blog.urls')), path('admin/', admin.site.urls), path('ckeditor', include('ckeditor_uploader.urls')), ] urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Comme indiqué, ckeditor
et admin
se chargent bien tandis que les autres ne le font pas. Voici un exemple de la sortie runserver
en mode débogage (le fichier à static / css / base.css
existe dans mon arborescence de fichiers):
DEBUG = True BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ... INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog', 'ckeditor', 'ckeditor_uploader', ] ... STATIC_ROOT = os.path.join(BASE_DIR, 'static') STATIC_URL = '/static/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/'
Voici d'autres informations susceptibles de vous intéresser:
admin
et ckeditor
fonctionnent. {% load static%}
comme indiqué par la documentation Django. Dans les anciennes versions, j'utilisais {% load staticfiles%}
et j'ai essayé cela aussi. collectstatic
dans les deux environnements. DEBUG = False
fonctionne bien en production (tous les fichiers statiques se chargent) mais aucun fichier statique ne se charge lorsque DEBUG = False
en développement. Il faut toutefois s'y attendre, car en développement, je n'ai pas de serveur Web pour gérer cela (pour clarifier, j'exécute généralement le serveur en mode débogage, mais j'ai essayé d'activer et de désactiver ce paramètre pour voir quels changements se produisent) Pour aider quiconque à résoudre mon problème, voici quelques extraits de fichiers pertinents:
settings.py
GET /static/ckeditor/ckeditor/ckeditor.js HTTP/1.1" 200 690627 GET /static/admin/css/fonts.css HTTP/1.1" 200 423 GET /static/admin/css/widgets.css HTTP/1.1" 200 10340 GET /static/css/base.css HTTP/1.1" 404 1761 GET /static/img/brand.png HTTP/1.1" 404 1764
4 Réponses :
Vos modèles d'url sont corrects, ce qui signifie que le problème est probablement lié à settings.DEBUG = False
dans le fichier de paramètres. Assurez-vous que settings.DEBUG
est True
et que les fichiers statiques doivent se charger. Vous pouvez le vérifier en utilisant manage.py shell
et en vérifiant la valeur de l'indicateur DEBUG
.
Le seul autre problème à rechercher est de savoir si vous pointez vers le fichier URL correct dans vos paramètres en vérifiant le paramètre ROOT_URLCONF
et si votre BASE_DIR
pointe vers le répertoire parent du répertoire static
. Les deux valeurs peuvent également être vérifiées dans shell
.
Par exemple, si votre fichier de paramètres se trouve dans /path/to/root/blog/settings.py code>, puis vous définissez
BASE_DIR
comme:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
Pardonnez-moi de ne pas être clair: bien que je dise que settings.DEBUG
est False
dans les informations supplémentaires, il est généralement défini sur True
en développement . Dans le cas mentionné ci-dessus, j'ai essayé de le changer en False
pour voir quel effet cela aurait, et le comportement était essentiellement comme prévu. Je ne manquerai pas de clarifier cela dans la question. Pour confirmer, j'ai vérifié le manage.py shell
et j'ai également forcé une erreur 404 lors de l'exécution du serveur: les deux ont indiqué DEBUG = True
. De plus, mon BASE_DIR
est exactement le même que celui que vous suggérez - je vais m'assurer que la question le reflète également.
Puisque vous avez 'django.contrib.staticfiles'
dans votre liste d'applications, Django ne charge PAS les fichiers depuis STATIC_ROOT lorsque DEBUG est True.
Lorsque DEBUG est activé, Django utilise l'option STATICFILES_FINDERS qui par défaut est:
STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'some_new_static_folder'), ]
FileSystemFinder trouvera les fichiers stockés dans le paramètre STATICFILES_DIRS
et AppDirectoriesFinder recherche des fichiers dans un sous-répertoire static
de chaque application.
C'est pourquoi les dossiers admin et ckeditor fonctionnent - Django n'utilise pas du tout votre dossier / root / static lorsque DEBUG est True. Au lieu de cela, il obtient des fichiers par AppDirectoriesFinder à partir des sous-répertoires static
des applications.
Quelque chose comme ... / 3.5 / lib / python3.5 / site-packages / django-ckeditor / static / ...
Lorsque vous exécutez la commande collectstatic
, il collecte tous les éléments statiques fichiers que STATICFILES_FINDERS peut trouver et les copie dans votre STATIC_ROOT (/ root / static /) et si DEBUG est False Django utilise simplement ce dossier au lieu de STATICFILES_FINDERS
Alors, comment vous pouvez le faire fonctionner avec le débogage activé. Créez simplement un dossier et ajoutez-le à STATICFILES_DIRS comme ceci:
[ 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', ]
Vous pouvez également supprimer tous les fichiers de / root / static /
que vous ne faites pas besoin de créer quelque chose dans ce dossier manuellement, collectstatic
le fera automatiquement pour la production.
J'ai également eu des problèmes avec les fichiers locaux et cela m'aide dans ma situation.
Je stocke mes fichiers statiques sur S3 mais vous pouvez ajuster l'URL de l'emplacement de votre image.
if DEBUG == False: STATICFILES_LOCATION = 'static' STATIC_URL = "//%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION) MEDIAFILES_LOCATION = 'media' MEDIA_URL = "//%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION) else: MEDIA_URL = '/media/' STATIC_URL = '/static/'
C'est une approche simple pour gérer les fichiers statiques dans django (qui fonctionne hors de la boîte si vous utilisez les options par défaut de Django):
STATIC_ROOT
. static
de l'application. static_files
dans votre projet et ajoutez à vos paramètres: STATICFILES_DIRS = [os.path.join (BASE_DIR, ' static_files '),]
. Vous pouvez évidemment choisir un autre nom, static_files
n'est qu'une suggestion. collectstatic
afin que Django collecte vos fichiers statiques (à partir des points 2. et 3.) et les place dans le dossier que vous avez créé en 1. li>
Si vous êtes en mode débogage, vous avez terminé après l'étape 3.
Dans votre cas , le problème était que vous mettiez du contenu statique dans STATIC_ROOT
qui est un dossier que Django ne recherchera pas de contenu en mode débogage.
admin
et ckeditor
fonctionnent car ils suivent l'étape 2., ainsi leurs fichiers statiques proviennent en fait du dossier de l'application installée et non de votre static
dossier en mode débogage.
Alors, voici comment résoudre votre problème :
img
et css
vers le dossier créé à l'étape 3. STATIC_ROOT
.
Avez-vous exécuté
collectstatic
?@nik_m oui, dans les deux environnements - j'ajouterai cela à la question
dans votre urls.py le chemin de ckeditor n'a pas de
/
essayez de le donner et voyez.Les fichiers statiques pour
ckeditor
sont déjà bien chargés dans les deux environnements. L'ajout du/
semble n'avoir aucun effet, ni sur les fichiers statiques duckeditor
ni sur les fichiers statiques qui ne sont pas chargés.ok, alors une autre suggestion pour la racine_statique et la racine_média,
STATIC_ROOT = os.path.join (BASE_DIR, 'static /')
etMEDIA_ROOT = os.path.join (BASE_DIR, 'media / ')
essayez ceci.Comme ci-dessus, cela n'a pas d'effet évident - en fait, les demandes faites au serveur sont identiques à celles faites avant le changement.
Quel est l'emplacement de votre fichier de paramètres?
@ 2ps
settings.py
est dans le dossiermysite
. J'ai mis à jour la question pour refléter cela.