1
votes

Django 2.2 ne sert pas de fichiers statiques

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:

 entrez la description de l'image ici

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',
            ],
        },
    },
]


0 commentaires

5 Réponses :


1
votes

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)


3 commentaires

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



1
votes

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.


1 commentaires

J'ai fait une modification. Veuillez consulter mes urls.py existantes



1
votes

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


0 commentaires

1
votes

essayez ceci:

STATIC_ROOT = os.path.join (BASE_DIR, "taskbuster", "static")


0 commentaires

0
votes

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é.


0 commentaires