如何修改Django的ImageField以接受SVG文件。

3

我正在使用Django Rest Framework(版本3.12.2)作为后端,React/Next.js作为前端。

我的目标非常简单,我想要将图片上传到photo_main字段中。

不幸的是,当尝试上传svg图像时,我收到了一个错误消息(png、jpg和jpeg都可以正常工作)。

错误消息:

{"photo_main":["Upload a valid image. The file you uploaded was either not an image or a corrupted image."]}

模型

class Recipe(models.Model):
    id = models.UUIDField( 
        primary_key=True,
        default=uuid.uuid4,
        editable=False,
    )
    author = models.ForeignKey(get_user_model() , on_delete=models.CASCADE, null=True, related_name='author') 
    photo_main = models.ImageField(upload_to='media/', blank=True)
    title = models.CharField(max_length=150)
    description = models.TextField(blank=True)

感谢您的提前帮助。

好问题,也很合理,但在大多数情况下,svg并不被视为图像。您应该查看rest_framework.fields.ImageField,然后为您的序列化器创建自定义字段,并在模型中使用FileField。这需要更多的工作,但这是一个需要自定义的场景。不建议验证文件扩展名-用户输入是不可信的。 - Andrew
1个回答

2

所以在浏览论坛后,我找到了解决方案:

validators.py

import os
from django.core.exceptions import ValidationError

def validate_file_extension(value):
    ext = os.path.splitext(value.name)[1]  # [0] returns path+filename
    valid_extensions = ['.jpg', '.jpeg', '.png', '.svg']
    if not ext.lower() in valid_extensions:
        raise ValidationError('Unsupported file extension.')

models.py

from app_name.valiators import validate_file_extension

image = models.ImageField('Image', upload_to=image_upload_path, validators=[validate_file_extension])

1
这个方法只对我在使用FileField而不是ImageField时有效,因为它使用PIL来检查上传的图像,而对于SVG格式的图像则无法正常工作。(Django 3.2) - Gnietschow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接