Esta es la primera vez que uso MEDIA_ROOT/MEDIA_URL y la configuración me confunde un poco. Tengo un formulario de carga de imágenes que guarda la imagen original más una copia redimensionada. Quiero guardar ambas imágenes en mi carpeta MEDIA, pero separarlas. Estructura actual:
project/ ----apps/ --------appOne/ ------------static/ ------------templates/ ------------__init__.py ------------models.py ------------urls.py ------------views.py --------__init__.py/ ----MEDIA/ ----project/ --------__init__.py --------settings.py --------urls.py ----manage.pyMe gustaría guardar la imagen cargada original en MEDIA/ y la imagen redimensionada en una carpeta dentro de la carpeta MEDIA, como MEDIA/media/. En este momento, está anidando 3 veces:
original image goes to ---> MEDIA/media/ resized image goes to ---> MEDIA/media/mediaEstoy casi seguro de que tengo la configuración incorrecta, pero he estado jugando con ella durante demasiado tiempo y nada funciona. Parece que cada tutorial configura las cosas de manera diferente y no estoy seguro de cuál es la estructura preferida o por qué mi configuración actual no funciona como esperaba.
Aquí está mi configuración.py:
MEDIA_ROOT = os.path.join(BASE_DIR,'MEDIA') MEDIA_URL = "media/"modelos.py:
from django.conf import settings from smartfields import fields from smartfields.dependencies import FileDependency from smartfields.processors import ImageProcessor class Image(models.Model): client = models.ForeignKey(Client, null=True, blank=True) model_pic = fields.ImageField(upload_to=settings.MEDIA_URL, dependencies=[ FileDependency(processor=ImageProcessor( format='PNG', scale={'max_width': 500, 'max_height': 500})) ])vistas.py:
def upload(request): form = ImageUploadForm(request.POST, request.FILES) if form.is_valid(): client = Client.objects.get(id=request.session['id']) image = Image.objects.create(client=client, model_pic=form.cleaned_data['image']) return redirect(reverse('cphh:gallery')) def show_images(request): context = { 'images': Image.objects.all().order_by('-created_at'), 'media_url': settings.MEDIA_URL, } return render(request,'cphh/gallery.html', context)Las imágenes cargadas anidadas triples se representan correctamente en mi plantilla:
{% for image in images %} <img class="gallery-image" src="{{media_url}}{{ image.model_pic }}" {% endfor %}Según la documentación
MEDIA_ROOT es la ruta absoluta del sistema de archivos al directorio que contendrá los archivos subidos por el usuario.
Su código que envía las imágenes cargadas a la raíz debe tener settings.MEDIA_ROOT/<sub-folder> en lugar de settings.MEDIA_URL
MEDIA_URL , por otro lado, es un marcador de posición para la url que un cliente debe presionar para acceder a sus medios. Esto es útil cuando no desea mantener sus medios en su sistema de archivos local, sino en un almacenamiento externo como amazon s3.
El uso {{MEDIA_URL}} en sus plantillas le brinda una buena manera de no codificar la ubicación final de los medios.
en primer lugar en la configuración.py MEDIA_URL debe ser así:
MEDIA_URL = "/media/"Luego elimine la carpeta MEDIA . Solo la carpeta multimedia es suficiente. y también si necesita miniaturas para sus imágenes cargadas, puede usar el paquete Django easy_thumbnails para esto