Je travaille actuellement sur des tutoriels pour approfondir mes connaissances sur Django. Ce faisant, j'ai décidé d'utiliser la version la plus récente de Django. J'ai pu surmonter la plupart des divergences entre mon code et celui du didacticiel, à l'exception d'une: les fichiers statiques ne sont pas servis. Maintenant, je ne suis pas tout à fait sûr que la différence soit strictement due à la version Django. Voici ce qui se passe.
J'ai la structure de projet suivante:
settings.py
from django.contrib import admin
from django.urls import path
from .views import home
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name='home')
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Ce qui est intéressant, c'est qu'avec cette configuration, le projet est capable de trouver des modèles avec succès. Cependant, comme mentionné ci-dessus, il ne peut pas trouver les fichiers statiques. Pourquoi?
De plus, ce tutoriel met en place une configuration inhabituelle en ce que les répertoires static et templates sont situés dans le répertoire principal de l'application, alors que Je les ai généralement un niveau plus haut, c'est-à-dire dans le répertoire de la racine du projet. Cela pourrait-il faire partie du problème? Qu'est-ce qui fait que Django recherche les fichiers un répertoire plus bas dans les paramètres de ce projet particulier? Les paramètres semblent les mêmes que ceux des autres projets que j'avais réalisés. Cependant, ces projets contenaient les répertoires static et templates dans le répertoire racine du projet.
Toute aide et clarification est appréciée.
Modifier:
urls.py
STATIC_URL = '/static/'
STATIC_FILES = (
os.path.join(BASE_DIR, "static"),
)
STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "staticfiles", "static")
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "templates")],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
5 Réponses :
essayez de remplacer ceci:
STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "static")
par
STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "staticfiles", "static")
Fournissez également l'état des fichiers (comme 404 messages)
Cela n'a pas aidé. En fait, cette ligne était mon ajout alors que j'essayais de faire fonctionner les choses.
essayez de déplacer le répertoire statique d'un niveau supérieur et réessayez
oh désolé, pouvez-vous essayer de mettre ceci dans vos paramètres: STATICFILES_DIRS = (os.path.join (BASE_DIR, 'static'),) au lieu de STATIC_ROOT
Pour servir des fichiers statiques, vous devez ajouter le configuration dans urls.py comme:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name='home')
]
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Ensuite, je pense que c'est une bonne pratique de mettre statique et templates dans leurs propres applications, ceci est utile si vous souhaitez rendre cette application plug -able dans un proche avenir.
Ou c'est aussi une bonne pratique de rassembler tous les fichiers statiques dans le répertoire de niveau projet et d'ajouter ce qui suit dans les paramètres pour l'identifier.
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
edit: Je vois juste la question mise à jour. Essayez d'ajouter ceci:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Ceci dit, tant que nous sommes en mode débogage, serons les fichiers statiques.
J'ai fait une modification. Veuillez consulter mes urls.py existantes
STATIC_FILES ne signifie rien pour Django, pour autant que je sache, même si vous l'utilisez peut-être dans un autre but.
La façon dont vous aviez défini STATIC_ROOT indiquait un répertoire inexistant.
Il existe une bonne référence dans StackOverflow ici a >
essayez ceci:
STATIC_ROOT = os.path.join (BASE_DIR, "taskbuster", "static")
J'ai pu résoudre le problème en modifiant les paramètres comme suit:
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "static")
De plus, il a été utile de lire la documentation suivante pour essayer de comprendre comment le résoudre p >
https://docs.djangoproject.com /fr/2.2/ref/settings/#std:setting-STATICFILES_FINDERS
En particulier, cela expliquait clairement ce que Django a fait:
La valeur par défaut trouvera les fichiers stockés dans le paramètre STATICFILES_DIRS (en utilisant django.contrib.staticfiles.finders.FileSystemFinder) et dans un sous-répertoire statique de chaque application (en utilisant django.contrib.staticfiles.finders.AppDirectoriesFinder). Si plusieurs les fichiers avec le même nom sont présents, le premier fichier trouvé sera utilisé.