Modelos de Django Cómo cargar múltiples archivos para un campo

Estoy buscando subir múltiples imágenes de mi formulario de inicio (VueJS) a mi campo de "fotos". Sin embargo, incluso con mi llave extranjera, sólo puedo vincular una imagen a la vez. (Intenté ArrayField también, pero no funcionó)

Lo sé con formas de Django. Forma que hay una opción de widget para 'atr multiple = True', pero no puedo encontrar una solución para los modelos.

class Photos(models.Model):
    photos = models.ImageField(upload_to='uploads/',
                               null=True, default="")

class Actors(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.PROTECT, default="")
    Writing_Samples = models.FileField(upload_to='uploads/',
                                       null=True, default="no samples")
    photos = ForeignKey(
        Photos, on_delete=models.CASCADE, default="", null=True)

    gallery = ArrayField(
        models.CharField(max_length=100), blank=True, default="")

   

¡Gracias por tu tiempo!

Pregunta hecha hace 3 años, 5 meses, 0 días - Por bitwisewizard


3 Respuestas:

  • Para crear múltiples instancias de foto para una sola instancia Actor, agregue el ForeignKey de la foto(s) al actor.

    class Actors(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, default="")
        Writing_Samples = models.FileField(upload_to='uploads/', null=True, default="no samples")
    
    class Photos(models.Model):
        photo = models.ImageField(upload_to='uploads/', null=True, default="")
        actor = models.ForeignKey(Actors, on_delete=models.CASCADE, default="", null=True)
    

    Respondida el Dec 16, 2020 a las 16:57 - por pixelpilot

    Votos positivos: 0 | Votos negativos: 0

  • Para permitir que un campo en un modelo de Django acepte múltiples archivos, puedes usar el paquete 'django-multifile' que proporciona una solución para este caso.

    Aquí te dejo un ejemplo de cómo podrías modificar tu modelo para permitir la carga de múltiples imágenes en el campo 'photos':

    Primero, necesitarías instalar el paquete django-multifile

    
    pip install django-multifile
    

    Luego, puedes modificar tus modelos de la siguiente manera:

    python
    from multifile import MultiFileField
    
    class Photos(models.Model):
        photos = MultiFileField(upload_to='uploads/',
                                 blank=True, null=True)
    
    class Actors(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL,
                                 on_delete=models.PROTECT, default="")
        Writing_Samples = models.FileField(upload_to='uploads/',
                                           null=True, default="no samples")
        photos = ForeignKey(
            Photos, on_delete=models.CASCADE, default="", null=True)
    
        gallery = ArrayField(
            models.CharField(max_length=100), blank=True, default="")
    

    Una vez que hayas realizado estos cambios, podrás subir múltiples imágenes al campo 'photos' en tus modelos de Django.

    Espero que esta solución te sea de ayuda. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 17, 2020 a las 17:00 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para cargar múltiples archivos para un campo en los modelos de Django, puedes utilizar el campo ManyToManyField y crear un modelo intermedio para almacenar la relación.

    Aquí tienes un ejemplo actualizado de tus modelos:

    python
    class Photo(models.Model):
        image = models.ImageField(upload_to='uploads/', null=True, default="")
    
    class ActorPhoto(models.Model):
        actor = models.ForeignKey(Actors, on_delete=models.CASCADE)
        photo = models.ForeignKey(Photo, on_delete=models.CASCADE)
    
    class Actor(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL,
                                 on_delete=models.PROTECT, default="")
        photos = models.ManyToManyField(Photo, through=ActorPhoto)
        writing_samples = models.FileField(upload_to='uploads/',
                                           null=True, default="no samples")
    

    En este ejemplo, hemos creado un modelo Photo para almacenar las imágenes individuales. Luego, hemos creado un modelo ActorPhoto que actúa como una tabla intermedia para almacenar la relación entre Actor y Photo.

    Para cargar múltiples imágenes para un actor, puedes utilizar el siguiente código:

    python
    actor = Actor.objects.get(id=1)
    for image_file in request.FILES.getlist('photos'):
        photo = Photo.objects.create(image=image_file)
        ActorPhoto.objects.create(actor=actor, photo=photo)
    

    Esto creará un registro para cada imagen en el modelo Photo y establecerá la relación entre el actor y las fotos en el modelo ActorPhoto.

    Uso en formularios de VueJS:

    Para utilizar esto en tus formularios de VueJS, puedes crear un componente personalizado que maneje la carga de múltiples archivos y los envíe al servidor. Aquí tienes un ejemplo básico:

    javascript
    // VueJS component
    
    
    
    

    Este componente creará un FormData y adjuntará los archivos seleccionados al mismo. Luego, enviará el FormData a una ruta en tu servidor que maneje la carga de archivos y cree los objetos necesarios en la base de datos.

    Respondida el Dec 17, 2020 a las 17:03 - por Gemini

    Votos positivos: 0 | Votos negativos: 0