web-dev-qa-db-fra.com

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

Django) et j'essaie de l'apprendre au travers d'un simple projet que je développe appelé "dubliners" et d'une application appelée "book". La structure de répertoires ressemble à ceci:

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ù devrais-je stocker le fichier? Quel chemin dois-je utiliser pour que la balise s'affiche à l'aide d'un modèle? J'ai essayé divers endroits et chemins, mais rien ne fonctionne jusqu'à présent.

...

Merci pour la réponse affichée ci-dessous. Cependant, j'ai essayé à la fois les chemins relatif et absolu vers l'image, et une icône d'image défectueuse s'affiche toujours 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. Si j’enregistre la page Web en tant que fichier HTML statique, les images s’affichent et le chemin est correct. Peut-être que le serveur Web par défaut fourni avec Django affichera les images uniquement si elles se trouvent sur un chemin particulier?

63
Tony

En production, le code HTML généré à partir de votre modèle pointe vers l'endroit où l'hôte héberge des fichiers multimédias. Donc, votre modèle aura juste par exemple

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

Et ensuite, assurez-vous que ce répertoire contient le (s) fichier (s) approprié (s).

pendant le développement est un problème différent. Les docs Django expliquent cela de manière succincte et suffisamment claire pour qu'il soit plus efficace de lier là-bas et de le taper ici, mais vous allez définir une vue pour les médias de site avec un chemin d'accès codé en dur vers l'emplacement sur le disque. .

Droit ici .

34
JosefAssad

Essaye ça,

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

Il faut se méfier! utiliser Context() vous donnera une valeur vide pour {{MEDIA_URL}}. Vous devez utiliser RequestContext() à la place.

J'espère que cela aidera.

66
steve

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 n’envisagez plus de créer du contenu de ce type.
C'est peut-être un cas rare, mais enfin - si vous avez une énorme quantité de "photos du jour" pour votre site - et que tous ces fichiers sont sur votre disque dur?

Dans ce cas, je ne vois aucun inconvénient à stocker un tel contenu dans STATIC.
Et tout devient vraiment simple:

statique

Pour créer un lien vers des fichiers statiques enregistrés dans STATIC_ROOT Django est livré avec une balise de modèle statique. Vous pouvez l'utiliser, que vous utilisiez ou non RequestContext.

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

copié depuis Official Django 1.4/balises et filtres de modèles intégrés

18
Andrey Belyak

Cela fait deux jours que je travaille sur ce projet, alors je pensais partager ma solution. Depuis le 26/11/10, la branche actuelle est 1.2.X, ce qui signifie que vous devez avoir les éléments suivants en vous settings.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 MEDIA_URL est une constante que vous utilisez dans vos modèles.) *

Puis en vous rl.py placez ce qui suit:

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">

Le moyen Django fonctionne (pour autant que je sache, c’est:

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

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" > 
9
Omar Giorgetti

en développement
Dans le dossier de votre application, créez un nom de dossier 'statique' et enregistrez votre image dans ce dossier.
Pour utiliser l'image, utilisez:

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

en production:
Tout comme dans le développement, ajoutez juste quelques paramètres supplémentaires pour Django:

  1. ajouter à settings.py
    STATIC_ROOT = os.path.join(BASE_DIR, "static/") (cela 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 terminall python manage.py collectstatic (cela copiera les fichiers statiques de toutes les applications incluses dans INSTALLED_APPS dans le dossier statique global - dossier STATIC_ROOT)

    C’est tout ce dont vous avez besoin Django, après cela, vous devez effectuer une configuration côté serveur Web afin de créer des conditions d’utilisation du dossier statique. 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), ajoutez:

    Alias ​​\ static "path_to_your_project\static"

    Exiger tout accordé

    Et c'est tout

8
FirePower

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}}">
6
Pstrazzulla

Votre

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

fonctionnera pour un fichier HTML lu à partir du 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 du genre: http://www.yourdomain.com/home/tony/london.jpg, qui peut être une URL invalide et non ce que vous voulez vraiment dire.

Pour savoir comment servir et où placer vos fichiers statiques, consultez ceci document . En gros, si vous utilisez le serveur de développement de Django, vous voulez lui montrer l’endroit où résident vos fichiers multimédias, puis créer votre urls.py servir ces fichiers (par exemple, en utilisant certains /static/ préfixe d'URL).

Vous devrez mettre quelque chose comme ça dans votre urls.py:

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

En environnement de production, vous souhaitez ignorer cette option et configurer votre serveur http ( Apache , lighttpd , etc) servir des fichiers statiques.

5
kender

Une autre façon de le faire:

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

Cela nécessiterait de 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}}"/>
3
Stephen Tanner

J'ai essayé diverses méthodes, cela n'a pas fonctionné. Mais cela a fonctionné. J'espère que cela fonctionnera pour vous également. Le fichier/répertoire doit être à ces emplacements:

projec/your_app/templates project/your_app/static

settings.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" 
2
user2458167

Si vous donnez l'adresse de l'image en ligne dans votre Django, cela fonctionnera. Cela fonctionnera pour moi. Vous devriez prendre une photo.

0
Bhaskar arya