es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Carga de múltiples imágenes en el administrador de Django.

Estoy teniendo muchos problemas tratando de codificar el modelo correcto para subir varias imágenes a mi aplicación Django. Quiero poder subir estas imágenes a través del administrador de Django. He intentado usar ImageField pero solo permite una imagen a la vez y también quiero poder redimensionar la imagen.

Aquí está mi models.py:

class Lesson(models.Model):
    DRAFT = 'draft'
    PUBLISHED = 'published'

    CHOICES_STATUS = (
        (DRAFT, 'Borrador'),
        (PUBLISHED, 'Publicado')
    )

    ARTICLE = 'artículo'
    QUIZ = 'quiz'

    CHOICES_LESSON_TYPE = (
        (ARTICLE, 'Artículo'),
        (QUIZ, 'Quiz')
    )

    curso = models.ForeignKey(Course, related_name='lecciones', on_delete=models.CASCADE)
    título = models.CharField(max_length=255)
    slug = models.SlugField()
    descripción_corta = models.TextField(blank=True, null=True)
    descripción_larga = models.TextField(blank=True, null=True)
    estado = models.CharField(max_length=20, choices=CHOICES_STATUS, default=PUBLISHED)
    tipo_lección = models.CharField(max_length=20, choices=CHOICES_LESSON_TYPE, default=ARTICLE)

Serializer.py:

class LessonListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Lesson
        fields = ('id', 'título', 'slug', 'descripción_corta', 'descripción_larga')

Admin.py:

class LessonAdmin(admin.ModelAdmin):
    list_display = ['título', 'curso', 'estado', 'tipo_lección']
    list_filter = ['estado', 'tipo_lección']
    search_fields = ['título', 'descripción_corta', 'descripción_larga']
    inlines = [LessonCommentInline]
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para subir varias imágenes a tu aplicación Django a través del administrador, necesitarás crear un modelo separado para las imágenes y usar una ForeignKey para enlazarlas al modelo Lesson. Aquí tienes un ejemplo de cómo puedes modificar tu código:

    from django.db import models
    
    class Lesson(models.Model):
        DRAFT = 'borrador'
        PUBLISHED = 'publicado'
    
        CHOICES_STATUS = (
            (DRAFT, 'Borrador'),
            (PUBLISHED, 'Publicado')
        )
    
        ARTICLE = 'artículo'
        QUIZ = 'cuestionario'
    
        CHOICES_LESSON_TYPE = (
            (ARTICLE, 'Artículo'),
            (QUIZ, 'Cuestionario')
        )
    
        course = models.ForeignKey(Course, related_name='lessons', on_delete=models.CASCADE)
        title = models.CharField(max_length=255)
        slug = models.SlugField()
        short_description = models.TextField(blank=True, null=True)
        long_description = models.TextField(blank=True, null=True)
        status = models.CharField(max_length=20, choices=CHOICES_STATUS, default=PUBLISHED)
        lesson_type = models.CharField(max_length=20, choices=CHOICES_LESSON_TYPE, default=ARTICLE)
    
    class Image(models.Model):
        lesson = models.ForeignKey(Lesson, related_name='images', on_delete=models.CASCADE)
        image = models.ImageField(upload_to='images/')
        width = models.IntegerField(blank=True, null=True)
        height = models.IntegerField(blank=True, null=True)
    
        def save(self, *args, **kwargs):
            if not self.width or not self.height:
                # obtener el tamaño de la imagen y guardarlo en el modelo
                from PIL import Image as PilImage
                with open(self.image.path, 'rb') as f:
                    img = PilImage.open(f)
                    self.width, self.height = img.size
                    super(Image, self).save(*args, **kwargs)
    
    class ImageInline(admin.TabularInline):
        model = Image
    
    class LessonAdmin(admin.ModelAdmin):
        inlines = [ImageInline]
    
    admin.site.register(Lesson, LessonAdmin)
    

    Aquí, hemos creado un nuevo modelo llamado Image que tiene un ForeignKey al modelo Lesson. El modelo Image tiene un ImageField, que permite subir varias imágenes a cada lección. Hemos agregado un método save al modelo Image para obtener automáticamente el ancho y alto de la imagen y guardarlos en el modelo.

    En la clase LessonAdmin, hemos agregado una clase ImageInline para mostrar las imágenes en la página del administrador de lecciones. Con esta configuración, ahora puedes subir múltiples imágenes a cada lección a través del administrador y también cambiar su tamaño.

Comments are closed.