J'essaie de télécharger une image via l'administrateur Django, puis de la visualiser dans une page de l'interface ou simplement via une URL.
Notez tout cela sur mon ordinateur local.
Mes paramètres sont les suivants:
MEDIA_ROOT = '/home/dan/mysite/media/'
MEDIA_URL = '/media/'
J'ai défini le paramètre upload_to sur 'images' et le fichier a été correctement chargé dans le répertoire:
'/home/dan/mysite/media/images/myimage.png'
Cependant, lorsque j'essaie d'accéder à l'image à l'URL suivante:
http://127.0.0.1:8000/media/images/myimage.png
Je reçois une erreur 404.
Dois-je configurer des patrons URLconf spécifiques pour les médias téléchargés?
Tout conseil apprécié.
Merci.
UPDATE pour Django> = 1.7
Documentation de Django 2.1: Servir des fichiers téléchargés par un utilisateur au cours du développement
from Django.conf import settings
from Django.conf.urls.static import static
urlpatterns = patterns('',
# ... the rest of your URLconf goes here ...
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Vous n'avez plus besoin de if settings.DEBUG
car Django s'en chargera en veillant à ce qu'il ne soit utilisé qu'en mode débogage.
Réponse ORIGINALE pour Django <= 1.6
Essayez de mettre ceci dans votre urls.py
from Django.conf import settings
# ... your normal urlpatterns here
if settings.DEBUG:
# static files (images, css, javascript, etc.)
urlpatterns += patterns('',
(r'^media/(?P<path>.*)$', 'Django.views.static.serve', {
'document_root': settings.MEDIA_ROOT}))
Avec cela, vous pouvez servir le support statique à partir de Django lorsque DEBUG = True
(lorsque vous exécutez sur un ordinateur local), mais vous pouvez laisser la configuration de votre serveur Web servir de support statique lorsque vous passez en production et DEBUG = False
Veuillez lire attentivement le texte officiel de Django DOC et vous obtiendrez la réponse qui vous convient le mieux.
Le meilleur moyen de résoudre ce problème est comme ci-dessous.
from Django.conf import settings
from Django.conf.urls.static import static
urlpatterns = patterns('',
# ... the rest of your URLconf goes here ...
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Pour Django 1.9, vous devez ajouter le code suivant conformément à la documentation:
from Django.conf import settings
from Django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Pour plus d'informations, vous pouvez vous référer ici: https://docs.djangoproject.com/fr/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development
Dois-je configurer des patrons URLconf spécifiques pour les médias téléchargés?
Oui. Pour le développement, il suffit d’ajouter ceci à votre URLconf:
if settings.DEBUG:
urlpatterns += patterns('Django.views.static',
(r'media/(?P<path>.*)', 'serve', {'document_root': settings.MEDIA_ROOT}),
)
Toutefois, pour la production, vous souhaiterez desservir le support à l'aide d'Apache, de lighttpd, de nginx ou de votre serveur Web préféré.
Voici ce que j'ai fait dans Django 2.0. Définissez d'abord MEDIA_ROOT un MEDIA_URL dans setting.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'data/') # 'data' is my media folder
MEDIA_URL = '/media/'
Activez ensuite la media
context_processors
dans TEMPLATE_CONTEXT_PROCESSORS
en ajoutant
TEMPLATES = [
{
'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
#here add your context Processors
'Django.template.context_processors.media',
],
},
},
]
Votre media context processor
est activé. Désormais, chaque RequestContext
contiendra une variable MEDIA_URL
.
Maintenant, vous pouvez accéder à cela dans votre template_name.html
<p><img src="{{ MEDIA_URL }}/image_001.jpeg"/></p>
(au moins) pour Django 1.8:
Si tu utilises
if settings.DEBUG:
urlpatterns.append(url(r'^media/(?P<path>.*)$', 'Django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))
comme décrit ci-dessus, assurez-vous qu'aucun modèle d'URL "intercepter tout", se dirigeant vers une vue par défaut, ne précède celui de urlpatterns = []. Comme .append mettra le schéma ajouté à la fin de la liste, il ne sera bien entendu testé que si aucun motif d'URL précédent ne correspond. Vous pouvez éviter cela en utilisant quelque chose comme ceci où le modèle d'URL "catch all" est ajouté à la fin, indépendamment de l'instruction if:
if settings.DEBUG:
urlpatterns.append(url(r'^media/(?P<path>.*)$', 'Django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))
urlpatterns.append(url(r'$', 'views.home', name='home')),
Un autre problème que vous êtes susceptible de rencontrer après avoir configuré tous vos modèles URLconf est que la variable {{ MEDIA_URL }}
ne fonctionnera pas dans vos modèles. Pour résoudre ce problème, dans votre settings.py , assurez-vous d’ajouter
Django.core.context_processors.media
dans votre TEMPLATE_CONTEXT_PROCESSORS
.
Voici les modifications que j'ai dû apporter pour fournir des PDF à l'application Django-publications à l'aide de Django 1.10.6:
Utilisez les mêmes définitions pour les répertoires de supports que vous, dans settings.py
:
MEDIA_ROOT = '/home/user/mysite/media/'
MEDIA_URL = '/media/'
Comme fourni par @thisisashwanipandey, dans le urls.py
du projet:
from Django.conf import settings
from Django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
et une modification de la réponse fournie par @ r-allela, dans settings.py
:
TEMPLATES = [
{
'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
# ... the rest of your context_processors goes here ...
'Django.template.context_processors.media',
],
},
},
]
Ajout à Micah Carrick réponse pour Django 1.8:
if settings.DEBUG:
urlpatterns.append(url(r'^media/(?P<path>.*)$', 'Django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))
Ceci si pour Django 1.10:
if settings.DEBUG:
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
C'est ce que j'ai fait pour obtenir un rendu d'image en mode DEBUG = False en Python 3.6 avec Django 1.11
from Django.views.static import serve
urlpatterns = [
url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
# other paths
]
Votre réglage est correct. Certains serveurs Web exigent de spécifier spécifiquement les fichiers de supports statiques et de supports. Par exemple, dans pythonanywhere.com, vous devez accéder à la section "Web" et ajouter l'URL od, les dossiers multimédia et le dossier statique. Par exemple:
URL Directory
/static/ /home/Saidmamad/discoverthepamirs/static
/accounts/static/ /home/Saidmamad/discoverthepamirs/accounts/static
/media/ /home/Saidmamad/discoverthepamirs/discoverthepamirs/media
Je sais qu'il est tard, mais juste pour aider ceux qui visitent ce lien à cause du même problème;)