python - Django admin 中的多张图片上传

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

我在尝试编写正确的模型以将多个图像上传到我的 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)

序列化器.py:

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

管理.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]

最佳答案

如果您想要多个图像,则需要为图像创建另一个表(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)

关于python - Django admin 中的多张图片上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70484288/

相关文章:

python - numpy.dot 和 a.dot(b) 的区别

python - 为什么会出现这个错误:"Sliced assignment is only supported for variables"

python - Python 中的字符串处理

vue.js - 如何在应用程序外部安装路由器链接?

vue.js - vuejs 将模型从父组件传递给子组件并允许突变

python - 带有 pip install 的 docker build 会覆盖现有的包

javascript - 为 django 管理站点实现一个简单的 jquery 函数

python - python3.6中根据提供的输入动态地将一个字典拆分为多个字典

python - django-allauth 自定义注册表单。如何添加带有图片上传的字段(图片字段)?

javascript - Vue路由器: HTML5 Canvas image links won't route to the right URL