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 ?

10voto

Omar Giorgetti Points 129

Répertoire /media sous la racine du projet

Paramètres.py

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

urls.py

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

modèle

<img src="{{MEDIA_URL}}/image.png" >

9voto

Pstrazzulla Points 71

Si votre fichier est un champ de modèle dans un modèle, vous pouvez également utiliser ".url" dans votre balise de modèle pour obtenir l'image.

Par exemple.

Si c'est votre modèle :

class Foo(models.Model):
    foo = models.TextField()
    bar = models.FileField(upload_to="foo-pictures", blank = True)  

Passez le modèle en contexte dans vos vues.

return render (request, "whatever.html", {'foo':Foo.objects.get(pk = 1)})

Dans votre modèle, vous pourriez avoir :

<img src = "{{foo.bar.url}}">

5voto

kender Points 18446

Votre

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

fonctionnera pour un fichier HTML lu sur le disque, car il supposera que l'URL est file:///home/... . Cependant, pour un fichier servi à partir d'un serveur web, l'URL deviendra quelque chose comme : http://www.yourdomain.com/home/tony/london.jpg qui peut être une URL invalide et ne pas correspondre à ce que vous voulez vraiment.

Pour savoir comment servir et où placer vos fichiers statiques, consultez ce document. document . En gros, si vous utilisez le serveur de développement de django, vous voulez lui montrer l'endroit où se trouvent vos fichiers multimédias, puis faire votre urls.py de servir ces fichiers (par exemple, en utilisant un certain /static/ préfixe de l'url).

Il faudra que vous mettiez quelque chose comme ceci dans votre urls.py :

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

Dans un environnement de production, vous pouvez ignorer cette étape et faire en sorte que votre serveur http ( apache , lighttpd etc) servent des fichiers statiques.

3voto

Stephen Tanner Points 11

Une autre façon de le faire :

MEDIA_ROOT = '/home/USER/Projects/REPO/src/PROJECT/APP/static/media/'
MEDIA_URL = '/static/media/'

Pour ce faire, vous devez déplacer votre dossier multimédia dans un sous-répertoire d'un dossier statique.

Ensuite, dans votre modèle, vous pouvez utiliser :

<img class="scale-with-grid" src="{{object.photo.url}}"/>

2voto

user2458167 Points 1

J'ai essayé plusieurs méthodes sans succès, mais celle-ci a fonctionné. J'espère qu'elle fonctionnera pour vous aussi. Le fichier/répertoire doit se trouver à cet endroit :

projet/votre_app/templates projet/votre_app/statique

paramètres.py

import os    
PROJECT_DIR = os.path.realpath(os.path.dirname(_____file_____))
STATIC_ROOT = '/your_path/static/'

exemple :

STATIC_ROOT = '/home/project_name/your_app/static/'    
STATIC_URL = '/static/'    
STATICFILES_DIRS =(     
PROJECT_DIR+'/static',    
##//don.t forget comma    
)
TEMPLATE_DIRS = (    
 PROJECT_DIR+'/templates/',    
)

proj/app/templates/filename.html

à l'intérieur du corps

{% load staticfiles %}

//for image

img src="{% static "fb.png" %}" alt="image here"

//note that fb.png is at /home/project/app/static/fb.png

Si fb.png était dans /home/project/app/static/image/fb.png alors

img src="{% static "images/fb.png" %}" alt="image here"

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