Accéder aux fichiers “Media” dans Django

J’aimerais aimer Django, mais cette activité de fichiers statiques et multimédias dans les environnements de développement me rend fou. S’il te plaît, sauve-moi de ma stupidité.

Je suis sur ma machine de développement. J’ai un media dossier à la racine de mon répertoire de projet.

Dans settings.py j’ai: MEDIA_ROOT = '' et MEDIA_URL = '/media/' .

Dans urls.py j’ai:

 if settings.DEBUG: urlpatterns += patterns('', url(r'^media/(?P.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, }), ) 

Mais la seule façon d’obtenir des fichiers multimédias est de faire référence à /media/media/ eg .

J’attends (et veux)

Quelqu’un peut-il me dire ce qui se passe ici et me donner une recette simple pour configurer la gestion des fichiers multimédias?

Merci beaucoup.


@Timmy O’Mahony – merci! poste épique, et très clair. Mais cela laisse quelques questions:

(1) Je dois utiliser /media/ et /static/ , pas media/ et static/ comme MEDIA_URL et et STATIC_URLSTATIC_URL -ce que quelque chose me manque?

(2) Si collectstatic hoses /static/ , où placez-vous les CSS au niveau du site, par exemple les fichiers CSS du site? Pas dans /static/ , évidemment.

(3) Je les place dans un répertoire ‘_’ de la racine du projet et STATICFILES_DIRS en STATICFILES_DIRS – et cela semble être là où le serveur de développement obtient ses fichiers statiques, malgré la directive urlpatterns . Si CELA est faux, où placez-vous les CSS au niveau du site pendant le développement, et quel est le stream de travail autour de collectstatic lorsque vous les modifiez – devez-vous les éditer à un endroit après chaque modification?

Pourquoi avez-vous MEDIA_ROOT paramètre MEDIA_ROOT ? Il doit être le chemin d’access à votre répertoire de médias. Comme, comme vous le dites, votre média se trouve dans un sous-répertoire appelé media , vous devez le mettre dans MEDIA_ROOT .

Configuration du dossier:

Votre racine de projet devrait être quelque chose comme:

 /app1 /app2 /media /static /templates urls.py settings.py manage.py 

Le dossier multimédia est censé contenir des éléments tels que des images, des téléchargements et d’autres documents pouvant être téléchargés pendant une utilisation normale du site Web (c.-à-d. Une fois le développement terminé).

Le dossier statique est supposé contenir tous les éléments CSS / JS et autres éléments faisant partie du développement du site.


Settings.py:

MEDIA_ROOT est le chemin absolu du serveur vers le dossier statique mentionné ci-dessus. Cela signifie que ce devrait être quelque chose comme:

 MEDIA_ROOT = "/User/Bob/Sites/MySite/Project_root/media/" 

MEDIA_URL est l’URL du navigateur que vous devez accéder à vos fichiers multimédia lorsque vous consultez le site. Il devrait être (généralement)

 MEDIA_URL = "media/" 

ce qui signifie que tous les documents peuvent être consultés sur http://example.com/media/

De même, STATIC_ROOT devrait être quelque chose comme

 STATIC_ROOT = "/User/Bob/Sites/MySite/Project_root/static/" 

et STATIC_URL soit

 STATIC_URL = "static/" 

Servant les fichiers:

Maintenant que vous avez dit à django où devraient se trouver ces dossiers et aux URL correctes pour y accéder, vous devez envoyer toutes les requêtes aux dossiers correctement.

Généralement, lorsque vous êtes en production, vous souhaitez que le serveur Web s’occupe de servir vos fichiers statiques et vos fichiers multimédias.

Si vous développez cependant, vous pouvez simplement obtenir le serveur de développement de django pour les servir pour vous.

Pour ce faire, vous lui indiquez de router toutes les requêtes qui arrivent sur http://example.com/media vers votre MEDIA_ROOT et toutes les requêtes qui arrivent sur http://example.com/static vers votre STATIC_ROOT.

Pour ce faire, vous ajoutez des URL à URLS.py comme:

 from django.conf import settings if settings.DEBUG: urlpatterns += patterns('', url(r'^media/(?P.*)$', 'django.views.static.serve', { 'document_root': settings.MEDIA_ROOT, }), url(r'^static/(?P.*)$', 'django.views.static.serve', { 'document_root': settings.STATIC_ROOT, }), ) 

Extra :

Si vous avez plusieurs applications, chacune avec ses propres fichiers CSS et JS, vous ne voudrez peut-être pas les lancer dans un seul dossier / static /. Il pourrait être utile de les placer dans des sous-dossiers des applications auxquelles ils appartiennent:

 /app1/static/ # Specific static folder /app2/static/ /media/ /static/ # Root static folder 

Maintenant, votre serveur web / serveur de développement recherche uniquement les fichiers statiques où vous lui avez demandé de regarder (c.-à-d. Le dossier statique racine). Vous devez donc collecter tous les fichiers dans les sous-dossiers et les copier dans le dossier statique. Vous pouvez le faire à la main, mais django fournit une commande pour le faire pour vous (c’est le but de l’application statique)

 ./manage collectstatic 

J’ai suivi la procédure timmy mais j’ai reçu une erreur indiquant que le nom du module était django.views . Lorsque j’utilise import django.views dans mon virtualenv, tout fonctionne bien, c’est-à-dire que l’importation de la bibliothèque n’est pas un problème.

Cependant, j’ai pu résoudre ce problème en suivant cette procédure dans mon fichier urls principal

 from django.conf.urls.static import static urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

https://docs.djangoproject.com/en/dev/howto/static-files/

Dans vos settings.py , assurez-vous d’append

django.core.context_processors.media

dans votre TEMPLATE_CONTEXT_PROCESSORS. Sinon, le MEDIA_ROOT ne fonctionnera pas lorsque vous l’utilisez dans les modèles.

J’ai eu le même problème alors j’ai ajouté ces lignes

 from django.conf.urls import url, include from django.consortingb import admin from django.conf import settings from django.conf.urls.static import static urlpatterns = [ url(r'', include('blog.urls')), url(r'^admin/', admin.site.urls), url(r'^cadmin/', include('cadmin.urls')), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

dans urls.py dans le répertoire de configuration du projet Django. plus d’informations: https://overiq.com/django/1.10/handling-media-files-in-django/

J’utilise Django 1.10. Et mon dossier multimédia est “uploads” Ceci est la configuration dans mes parameters.py:

 MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads') MEDIA_URL = '/uploads/' 

Et dans le modèle, je mets le nom de mon MEDIA_URL avant de object.name à la place object.url comme ceci:

  {{imagen_identificativa}} 

Et cela fonctionne pour moi. J’espère que ça aide.