Servir archivos de imagen desde el administrador de Django.

Para un sitio que estoy construyendo (el primer sitio web desde cero, por lo tanto, nuevo en django), deseo proporcionar al administrador un medio para implementar imágenes desde las páginas de administración, que se utilizarán para impulsar la lógica empresarial desde la perspectiva del cliente. Sin embargo, quiero que el administrador también pueda ver estas imágenes desde la página de administración. Así que quiero que se pueda acceder a una carpeta de imágenes común desde las vistas de aplicaciones y la vista de administrador. Actualmente solo tengo una aplicación llamada retailFilters.

Ahora, la implementación de algunos archivos en mi carpeta de medios / imágenes no es un problema, agrego un registro (especificando una imagen para cargar) en la página de administración y, efectivamente, los archivos están esperando exactamente donde esperaba estar. También me doy cuenta de que tengo que decirle a django de dónde servirlos y de buscar en Internet tengo mis MEDIA_ROOT, MEDIA_URL y urlpatterns definidos como:

settings.py

... parent_dir = os.path.abspath(os.path.dirname(__file__) + '/..') MEDIA_ROOT = os.path.join(parent_dir, 'media/') MEDIA_URL = 'media/' 

(e INSTALLED_APPS incluye django.contrib.staticfiles))

urls.py

 urlpatterns = [ url(r'^admin/', admin.site.urls), ] urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT) 

Sin embargo, la respuesta al hacer clic en ellos es que el administrador realiza un error de banner:

“Filter with ID” 1 / change / media / images / 2012-03-29 “.27.05.jpg” no existe. Tal vez fue eliminado? ”


Mi versión de python es 2.7.10

Mi versión django es 1.11

La estructura de mi directorio en este momento (la raíz es el directorio del proyecto) es la siguiente:

 . ├── db.sqlite3 ├── manage.py ├── media │  └── images │  └── 2012-03-29_22.27.05.jpg ├── NOTES ├── retailFilters │  ├── admin.py │  ├── admin.pyc │  ├── apps.py │  ├── fixtures │  │  └── boltons.json │  ├── __init__.py │  ├── __init__.pyc │  ├── migrations │  │  ├── 0001_initial.py │  │  ├── 0001_initial.pyc │  │  ├── 0002_auto_20170816_1934.py │  │  ├── 0002_auto_20170816_1934.pyc │  │  ├── __init__.py │  │  └── __init__.pyc │  ├── models.py │  ├── models.pyc │  ├── tables │  │  ├── Bolt_On_Group.py │  │  ├── Bolt_On_Group.pyc │  │  ├── Bolt_On.py │  │  ├── Bolt_On.pyc │  │  ├── Filter.py │  │  ├── Filter.pyc │  │  ├── __init__.py │  │  ├── __init__.pyc │  │  ├── Order_Payment.py │  │  ├── Order_Payment.pyc │  │  ├── Order.py │  │  ├── Order.pyc │  │  ├── Payment_Vendor.py │  │  ├── Payment_Vendor.pyc │  │  ├── User.py │  │  └── User.pyc │  ├── tests.py │  └── views.py ├── snapify │  ├── __init__.py │  ├── __init__.pyc │  ├── settings.py │  ├── settings.pyc │  ├── urls.py │  ├── urls.pyc │  ├── wsgi.py │  └── wsgi.pyc └── static └── retailFilters └── media └── images 

mi admin.py tiene:

 # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.contrib import admin from django.contrib.auth.models import User from django.contrib.auth.models import Group from tables.Filter import Filter admin.site.unregister(User) admin.site.unregister(Group)  @admin.register(Filter) class FILTER_Admin(admin.ModelAdmin) : fields = ('DESCRIPTION', 'FILENAME', 'CATEGORY', 'PRICE') #list_display = ('show_image',) 

y mi modelo para filtro es:

Filter.py

 # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models from django.core.exceptions import ValidationError from django.core.files.storage import FileSystemStorage import os import pdb categories = {'T': 'Personalised Template', 'C': 'Custom Filter'} images = 'images' class Filter(models.Model) : FILTER_REFERENCE = models.IntegerField(primary_key = True) FILENAME = models.ImageField(upload_to = images) DESCRIPTION = models.TextField() CATEGORY = models.CharField(max_length = 1, null = True, choices = [(x, categories[x]) for x in categories]) PRICE = models.DecimalField(default = 0.00, max_digits = 5, decimal_places = 2) def __unicode__(self) : return self.DESCRIPTION #def show_image(self) : # #pdb.set_trace() # return ''.format(self.FILENAME) #show_image.allow_tags = True 

y la última salida de la línea de comandos de runerver:

 System check identified no issues (0 silenced). August 16, 2017 - 20:03:42 Django version 1.11.1, using settings 'snapify.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. [16/Aug/2017 20:03:44] "GET /admin/ HTTP/1.1" 200 4683 [16/Aug/2017 20:03:47] "GET /admin/retailFilters/filter/ HTTP/1.1" 200 4203 [16/Aug/2017 20:03:47] "GET /admin/jsi18n/ HTTP/1.1" 200 3217 [16/Aug/2017 20:03:55] "POST /admin/retailFilters/filter/ HTTP/1.1" 200 3175 [16/Aug/2017 20:03:57] "POST /admin/retailFilters/filter/ HTTP/1.1" 302 0 [16/Aug/2017 20:03:57] "GET /admin/retailFilters/filter/ HTTP/1.1" 200 3189 [16/Aug/2017 20:03:58] "GET /admin/jsi18n/ HTTP/1.1" 200 3217 [16/Aug/2017 20:04:04] "GET /admin/retailFilters/filter/ HTTP/1.1" 200 3067 [16/Aug/2017 20:04:06] "GET /admin/retailFilters/ HTTP/1.1" 200 3167 [16/Aug/2017 20:04:08] "GET /admin/retailFilters/filter/add/ HTTP/1.1" 200 5420 [16/Aug/2017 20:04:08] "GET /admin/jsi18n/ HTTP/1.1" 200 3217 [16/Aug/2017 20:04:20] "POST /admin/retailFilters/filter/add/ HTTP/1.1" 302 0 [16/Aug/2017 20:04:20] "GET /admin/retailFilters/filter/ HTTP/1.1" 200 4391 [16/Aug/2017 20:04:20] "GET /admin/jsi18n/ HTTP/1.1" 200 3217 [16/Aug/2017 20:04:23] "GET /admin/retailFilters/filter/1/change/ HTTP/1.1" 200 5789 [16/Aug/2017 20:04:23] "GET /admin/jsi18n/ HTTP/1.1" 200 3217 [16/Aug/2017 20:04:25] "GET /admin/retailFilters/filter/1/change/media/images/2012-03-29_22.27.05.jpg/ HTTP/1.1" 302 0 [16/Aug/2017 20:04:25] "GET /admin/retailFilters/filter/1/change/media/images/2012-03-29_22.27.05.jpg/change/ HTTP/1.1" 302 0 [16/Aug/2017 20:04:25] "GET /admin/ HTTP/1.1" 200 5427 [16/Aug/2017 20:04:29] "GET /admin/retailFilters/filter/1/change/ HTTP/1.1" 200 5789 

Lo siento si esto se ha pedido en innumerables ocasiones, pero he pasado 5 horas recorriendo Internet por este problema y todavía no he tenido éxito.

¿Alguien puede señalar lo que me estoy perdiendo?

Solo necesitas cambiar la configuración.py:

 MEDIA_ROOT = os.path.join(parent_dir, 'media/') MEDIA_URL = '/media/' #------------^