2017-02-06 4 views
0

Je voudrais avoir un ImageField dans le formulaire d'administration pour mon modèle (par exemple, pour le profil d'un individu). Et je voudrais afficher cette image dans une vue plus tard.Django - ImageField, télécharger, stocker et servir l'image dans le serveur de développement

C'est le modèle que j'ai:

class Individual(models.Model): 
    ind_name = models.CharField(max_length=100) 
    ind_photo = models.ImageField(default="default.jpg") 

    def __str__(self): 
     return self.ind_name 

C'est ce que j'ai dans les paramètres de mon site:

STATIC_URL = '/static/' 
STATIC_ROOT = os.path.join(BASE_DIR, "static") 
MEDIA_URL = '/static/media/' 
MEDIA_ROOT = os.path.join(BASE_DIR,"static/media") 

Ce sont les urls de mon application:

urlpatterns = [ 
    url(r'^$', views.index, name="index") 
] 

Je sais comment utiliser des fichiers statiques (CSS, Javascript, par exemple) et les faire fonctionner à la fois en développement et en production. Mais je n'ai aucune idée de comment faire fonctionner les images. J'ai lu Managing static files et Deploying static files, mais je ne comprends toujours pas.

Avec le code ci-dessus, l'image est enregistrée dans le bon dossier (c'est-à-dire/static/media au niveau de mon site). Mais je n'ai aucune idée:

1) comment l'afficher dans un modèle,

2) s'il serait préférable de garder ces images dans le dossier statique de mon application,

3) et (si 2) si je devrais exécuter collectstatic chaque fois que quelqu'un télécharge une image dans l'admin. Désolé si je ne suis pas clair, mais de cette façon plus obscure que je pensais que ce serait.

Répondre

0

Pour l'image à télécharger et servi au cours du développement, je devais déplacer le dossier multimédia hors du dossier statique (à savoir créer un dossier multimédia à la racine du dossier de mon projet).

Et dans ma principale urls.py, je devais ajouter:

from django.conf import settings 
from django.conf.urls.static import static 

if settings.DEBUG: 
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

comme suggéré par MicroPyramid.

Pour l'afficher dans un modèle, pour un individu « quelqu'un » (d'un queryset) donné, je l'utilise:

<img src="{{ somebody.ind_photo.url }}"> 
0

Il est recommandé de séparer à la fois les fichiers statiques et les fichiers multimédias. Oui, vous devez effectuer collectstatic tout le temps lorsque vous téléchargez si vous stockez les images dans un dossier statique. Nous pouvons obtenir l'URL complète de l'image de la manière suivante.

{{obj.ind_photo.url}} 

Pour plus d'informations sur les fichiers https://docs.djangoproject.com/en/1.10/topics/files/

+0

Je ne peux pas afficher cette image avec cela dans le serveur de développement. L'url est le bon chemin, mais il n'est pas servi. De plus, si je dois exécuter collectstatic à chaque fois qu'une image est téléchargée dans l'admin, où dois-je l'accrocher? Dans la méthode save pour mon modèle? – GuitarExtended

+0

En général, dans l'environnement de développement/production, nous serons au service des fichiers statiques ou multimédia avec le serveur web. Vous devez donc configurer le chemin de votre répertoire multimédia sur votre serveur Web. – MicroPyramid

+0

Je pense que je peux le faire fonctionner en production, mais j'ai besoin de tester des choses pendant le développement. Alors, comment puis-je servir l'image lors de l'exécution du serveur de développement? – GuitarExtended