87 votes

Comment inclure des fichiers image dans les modèles Django ?

Je suis nouveau dans l'univers de Django et j'essaie de l'apprendre à travers un projet simple que je développe, appelé "dubliners", et une application appelée "book". La structure des répertoires est la suivante :

dubliners/book/  [includes models.py, views.py, etc.]
dubliners/templates/book/

J'ai un fichier JPG qui doit être affiché dans l'en-tête de chaque page Web. Où dois-je stocker le fichier ? Quel chemin dois-je utiliser pour la balise afin de l'afficher à l'aide d'un modèle ? J'ai essayé différents emplacements et chemins, mais rien ne fonctionne pour l'instant.

...

Merci pour la réponse publiée ci-dessous. Cependant, j'ai essayé les chemins relatifs et absolus vers l'image, et j'obtiens toujours une icône d'image cassée affichée dans la page Web. Par exemple, si j'ai une image dans mon répertoire personnel et que j'utilise cette balise dans mon modèle :

<img src="/home/tony/london.jpg" /> 

L'image ne s'affiche pas. En revanche, si j'enregistre la page Web en tant que fichier HTML statique, les images s'affichent, ce qui signifie que le chemin d'accès est correct. Peut-être que le serveur Web par défaut fourni avec Django n'affiche les images que si elles se trouvent sur un chemin particulier ?

76voto

Essayez ça,

paramètres.py

# typically, os.path.join(os.path.dirname(__file__), 'media')
MEDIA_ROOT = '<your_path>/media'
MEDIA_URL = '/media/'

urls.py

urlpatterns = patterns('',
               (r'^media/(?P<path>.*)$', 'django.views.static.serve',
                 {'document_root': settings.MEDIA_ROOT}),
              )

.html

<img src="{{ MEDIA_URL }}<sub-dir-under-media-if-any>/<image-name.ext>" />

Caveat

Attention ! en utilisant Context() vous donnera une valeur vide pour {{MEDIA_URL}} . Vous devez utiliser RequestContext() à la place.

J'espère que cela vous aidera.

2 votes

Merci beaucoup pour cette réponse ! Enfin la seule réponse qui m'a vraiment aidé !

0 votes

Qu'est-ce que {'document_root': settings.MEDIA_ROOT} Est-ce le contexte fourni à la fonction appelée ?

51voto

JosefAssad Points 2324

En production, le HTML généré à partir de votre modèle pointera simplement vers l'endroit où l'hôte stocke les fichiers multimédias. Ainsi, votre modèle aura par exemple

<img src="../media/foo.png">

Ensuite, vous vous assurerez que ce répertoire est présent avec le(s) fichier(s) correspondant(s).

pendant le développement est un problème différent. La documentation de django l'explique de manière succincte et suffisamment claire pour qu'il soit plus efficace d'y faire un lien et de l'écrire ici, mais en gros, vous définissez une vue pour les médias du site avec un chemin d'accès codé en dur vers l'emplacement sur le disque.

Droit aquí .

36 votes

Il est probablement préférable d'utiliser <img src="{{MEDIA_URL}}foo.png/> plutôt que de coder en dur l'emplacement de votre média.

0 votes

Ignorez ce qui précède, je comprends maintenant - j'ai lu la page sur le service des fichiers statiques dont vous avez fait le lien.

0 votes

Pourquoi ne pas simplement utiliser <img src="{{ book.image.url }}"> où book est le nom de l'objet. De cette façon, vous n'avez pas besoin de connaître le nom du fichier et vous n'avez pas besoin d'ajouter {{ MEDIA_URL }}.

19voto

Andrey Belyak Points 125

Je comprends que votre question portait sur les fichiers stockés dans MEDIA_ROOT, mais il est parfois possible de stocker du contenu en statique, lorsque vous ne prévoyez plus de créer du contenu de ce type.
Il s'agit peut-être d'un cas rare, mais quoi qu'il en soit, si vous avez une grande quantité de "photos du jour" pour votre site - et que tous ces fichiers se trouvent sur votre disque dur ?

Dans ce cas, je ne vois pas de contre-indication à stocker un tel contenu dans STATIC.
Et tout devient très simple :

statique

Pour établir un lien avec les fichiers statiques enregistrés dans STATIC_ROOT, Django est livré avec une balise de modèle statique. Vous pouvez l'utiliser indépendamment du fait que que vous utilisiez RequestContext ou non.

{% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" />

copié à partir de Documentation officielle django 1.4 / Balises et filtres de modèles intégrés

13voto

FirePower Points 376

En cours de développement
Dans votre dossier d'applications, créez un dossier intitulé "static" et enregistrez votre image dans ce dossier.
Pour utiliser l'image :

<html>
    <head>
       {% load staticfiles %} <!-- Prepare django to load static files -->
    </head>
    <body>
        <img src={% static "image.jpg" %}>
    </body>
</html>

En cours de production :
Tout est identique à celui du développement, il suffit d'ajouter quelques paramètres supplémentaires pour Django :

  1. ajouter paramètres.py
    STATIC_ROOT = os.path.join(BASE_DIR, "static/") (ceci préparera le dossier où seront stockés les fichiers statiques de toutes les applications)

  2. assurez-vous que votre application est dans INSTALLED_APPS = ['myapp',]

  3. dans la commande d'exécution terminale python manage.py collectstatic (ceci fera une copie des fichiers statiques de toutes les applications incluses dans INSTALLED_APPS vers le dossier statique global - dossier STATIC_ROOT).

    C'est tout ce dont Django a besoin, après cela, vous devez effectuer une configuration côté serveur web pour créer des autorisations d'utilisation de dossiers statiques. Par exemple, dans apache2, dans le fichier de configuration httpd.conf (pour Windows) ou sites-enabled/000-default.conf. (sous la partie hôte virtuel du site pour linux) ajouter :

    Alias \static "chemin_vers_votre_projet \static "

    Exiger que toutes les subventions

    Et c'est tout

1 votes

Cette réponse est incomplète. Pour utiliser des fichiers statiques dans vos modèles, les paramètres de la section settings.py doit être correctement configuré. Lisez les documents

0 votes

La configuration par défaut dans les paramètres est d'utiliser un dossier statique pour importer des fichiers statiques (STATIC_URL = '/static/').

0 votes

À partir de Django 3, ce devrait être {% load static %} .

12voto

Robert Points 61

J'ai passé deux jours entiers à travailler sur ce problème et j'ai donc pensé que je devais également partager ma solution. Au 26/11/10, la branche actuelle est 1.2.X, ce qui signifie que vous devez avoir les éléments suivants dans votre système paramètres.py :

MEDIA_ROOT = "<path_to_files>" (i.e. /home/project/django/app/templates/static)
MEDIA_URL = "http://localhost:8000/static/"

*(rappelez-vous que MEDIA_ROOT est l'endroit où se trouvent les fichiers et que MEDIA_URL est une constante que vous utilisez dans vos modèles).

Alors en vous url.py placer les éléments suivants :

import settings

# stuff

(r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),

Ensuite, dans votre html, vous pouvez utiliser :

<img src="{{ MEDIA_URL }}foo.jpg">

La façon dont django fonctionne (pour autant que je sache) est la suivante :

  1. Dans le fichier html, il remplace MEDIA_URL par le chemin MEDIA_URL trouvé dans setting.py
  2. Il recherche dans url.py toutes les correspondances pour le MEDIA_URL et ensuite, s'il trouve une correspondance (comme r'^statique/(?P. )$'* concerne http://localhost:8000/static/ ) il cherche le fichier dans le MEDIA_ROOT et le charge.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X