【问题标题】:Multiple image upload in Django adminDjango admin 中的多张图片上传
【发布时间】:2022-01-25 18:11:17
【问题描述】:

我在尝试编写正确的模型以将多个图像上传到我的 Django 应用程序时遇到了很多麻烦。我希望能够通过 django 管理员上传这些图片。我曾尝试使用 ImageField,但它一次只允许一张图片,而且我还希望能够调整图像大小。

这是我的models.py:

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

    CHOICES_STATUS = (
        (DRAFT, 'Draft'),
        (PUBLISHED, 'Published')
    )

    ARTICLE = 'article'
    QUIZ = 'quiz'

    CHOICES_LESSON_TYPE = (
        (ARTICLE, 'Article'),
        (QUIZ, 'Quiz')
    )

    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)

Serializer.py:

class LessonListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Lesson
        fields = ('id', 'title', 'slug', 'short_description', 'long_description')

Admin.py:

class LessonAdmin(admin.ModelAdmin):
    list_display = ['title', 'course', 'status', 'lesson_type']
    list_filter = ['status', 'lesson_type']
    search_fields = ['title', 'short_description', 'long_description']
    inlines = [LessonCommentInline]

【问题讨论】:

    标签: python django vue.js django-models django-admin


    【解决方案1】:

    如果您想要多个图像,则需要为图像创建另一个表(One2Many 关系)。

    pip install --upgrade Pillow#如果需要

    # import PIL for image resizing
    from PIL import Image
    
    class Photo(models.Model):
        lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE, related_name='photos')
        photo = models.ImageField(upload_to ='photos/')
    
        # resizing the image, you can change parameters like size and quality.
        def save(self, *args, **kwargs):
           super(Photo, self).save(*args, **kwargs)
           img = Image.open(self.photo.path)
           if img.height > 1125 or img.width > 1125:
               img.thumbnail((1125,1125))
           img.save(self.photo.path,quality=70,optimize=True)
    

    对于管理员,您可以这样做:

    admin.py
    class PhotoAdmin(admin.StackedInline):
        model = Photo
    
    class LessonAdmin(admin.ModelAdmin):
        inlines = [PhotoAdmin]
    
        class Meta:
            model = Lesson
    
    
    admin.site.register(Photo)
    admin.site.register(Lesson, LessonAdmin)
    

    【讨论】:

    • 谢谢@lucutzu33,但我可以在LessonAdmin 内联中添加另一个管理类吗?我已经将它用于 LessonCommentInline。
    • 当然,这是一个列表。
    • 感谢您的帮助!它绝对有效。我是 Django 和 Vue.js 的菜鸟。我无法在前端显示图像,但我可以在管理部分上传多个文件。我是否需要将“照片”添加到课程 serializer.py 并使用 {{ course.photo }} 调用照片??
    • 是的,类似这样:photos = PhotoSerializers(read_only=True, many=True)
    猜你喜欢
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多