Django MEDIA_URL y MEDIA_ROOT

Intento subir una imagen a través del administrador de Django y luego ver esa imagen en una página en la interfaz o simplemente a través de una URL.

Tenga en cuenta que todo esto está en mi máquina local.

Mi configuración es la siguiente:

MEDIA_ROOT = '/home/dan/mysite/media/' MEDIA_URL = '/media/' 

Establecí el parámetro upload_to en ‘imágenes’ y el archivo se ha cargado correctamente en el directorio:

 '/home/dan/mysite/media/images/myimage.png' 

Sin embargo, cuando bash acceder a la imagen en la siguiente URL:

 http://127.0.0.1:8000/media/images/myimage.png 

Me sale un error 404.

¿Debo configurar patrones específicos de URLconf para los medios cargados?

Cualquier consejo apreciado.

Gracias.

Intenta poner esto en tu 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.*)$', 'django.views.static.serve', { 'document_root': settings.MEDIA_ROOT})) 

Con esto puede servir los medios estáticos de Django cuando DEBUG = True (cuando se ejecuta en una computadora local) pero puede permitir que la configuración de su servidor web sirva para medios estáticos cuando vaya a producción y DEBUG = False

Lea detenidamente el Django DOC oficial y encontrará la respuesta más adecuada.

La mejor y más fácil manera de resolver esto es como a continuación.

 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) 

Para Django 1.9, debe agregar el siguiente código según la documentación:

 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) 

Para obtener más información, puede consultar aquí: https://docs.djangoproject.com/en/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development

¿Debo configurar patrones específicos de URLconf para los medios cargados?

Sí. Para el desarrollo, es tan fácil como agregar esto a su URLconf:

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

Sin embargo, para la producción, querrá servir los medios usando Apache, lighttpd, nginx o su servidor web preferido.

Aquí lo que hice en Django 2.0. Establezca First MEDIA_ROOT en MEDIA_URL en setting.py

 MEDIA_ROOT = os.path.join(BASE_DIR, 'data/') # 'data' is my media folder MEDIA_URL = '/media/' 

Luego habilite los media context_processors en TEMPLATE_CONTEXT_PROCESSORS agregando

 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ #here add your context Processors 'django.template.context_processors.media', ], }, }, ] 

Su media context processor está habilitado, ahora cada RequestContext contendrá una variable MEDIA_URL .

Ahora puede acceder a esto en su template_name.html

 

(al menos) para Django 1.8:

Si utiliza

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

como se describió anteriormente, asegúrese de que ningún patrón de URL “catch all”, que dirige a una vista predeterminada, aparezca antes que en urlpatterns = []. Como .append colocará el esquema agregado al final de la lista, por supuesto, solo se probará si no coincide ningún patrón de URL anterior. Puede evitar eso usando algo como esto donde el patrón de URL “catch all” se agrega al final, independientemente de la instrucción if:

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

Otro problema que probablemente enfrente después de configurar todos sus patrones de URLconf es que la variable {{ MEDIA_URL }} no funcionará en sus plantillas. Para solucionar esto, en su settings.py , asegúrese de agregar

django.core.context_processors.media

en tu TEMPLATE_CONTEXT_PROCESSORS .

Aquí están los cambios que tuve que hacer para entregar archivos PDF para la aplicación django-publications , usando Django 1.10.6:

Usó las mismas definiciones para los directorios de medios que usted, en settings.py :

 MEDIA_ROOT = '/home/user/mysite/media/' MEDIA_URL = '/media/' 

Según lo provisto por @thisisashwanipandey, en el urls.py principal del proyecto:

 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) 

y una modificación de la respuesta provista por @r-allela, en 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', ], }, }, ] 

Agregando a Micah Carrick respuesta para django 1.8:

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

Esto si para Django 1.10:

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

Tu configuración está bien. Algunos servidores web requieren especificar los medios y archivos de carpetas estáticas específicamente. Por ejemplo, en pythonanywhere.com debe ir a la sección ‘Web’ y agregar la URL de las carpetas multimedia y la carpeta estática. Por ejemplo:

  URL Directory /static/ /home/Saidmamad/discoverthepamirs/static /accounts/static/ /home/Saidmamad/discoverthepamirs/accounts/static /media/ /home/Saidmamad/discoverthepamirs/discoverthepamirs/media 

Sé que es tarde, pero solo para ayudar a quienes visitan este enlace debido al mismo problema;)