允许SVG文件通过Django admin上传到ImageField

Yas*_*ari 6 python django svg django-forms

我正在切换到SVG图像来代表我的电子商务平台上的类别.我之前models.ImageField在Category模型中使用它来存储图像,但forms.ImageField验证不能处理基于矢量的图像(因此拒绝它).

我不需要对有害文件进行彻底验证,因为所有上传都将通过Django Admin完成.看起来我必须models.FileField在我的模型中切换到a ,但我确实希望警告不要上传无效图像.

Nick Khlestov 在django-rest-framework的 ImageField上写了一个SVGAndImageFormField(在文章中找到源代码,我没有足够的声誉发布更多链接).我如何使用这个解决方案而不是Django的ImageField(而不是DRF)?

Wto*_*wer 6

我从未使用过,SVGAndImageFormField所以我无法对此发表评论。就我个人而言,我本来会选择的简单应用程序FileField,但这显然取决于项目要求。我将在下面对此进行扩展:

如评论中所述,ImageField和FileField之间的基本区别在于,第一个使用Pillow检查文件是否为图像:

从FileField继承所有属性和方法,但还验证上载的对象是有效的图像。

参考:Django docsDjango源代码

它还提供了一些可能与SVG情况无关的属性(高度,宽度)。

因此,模型字段可以是:

    svg = models.FileField(upload_to=..., validators=[validate_svg])
Run Code Online (Sandbox Code Playgroud)

您可以使用is_svg相关问题中提供的类似功能:

如何在不使用幻数的情况下将文件表示为SVG?

然后是一个验证SVG的函数:

def validate_svg(file, valid):
    if not is_svg(file):
        raise ValidationError("File not svg")
Run Code Online (Sandbox Code Playgroud)


Yas*_*ari 5

事实证明,它SVGAndImageFormField与DRF没有任何依赖关系ImageField,仅增加了由进行的验证django.forms.ImageField

因此,为了在Django Admin中接受SVG,我将模型的更改为ImageFieldFileField指定了覆盖,如下所示:

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        exclude = []
        field_classes = {
            'image_field': SVGAndImageFormField,
        }

class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm

admin.site.register(MyModel, MyModelAdmin)
Run Code Online (Sandbox Code Playgroud)

现在,它可以接受所有以前的图像格式以及SVG。

编辑:刚刚发现,即使您不从切换到,也models.ImageField可以使用models.FileField。的heightwidth属性models.ImageField仍然适用于栅格图像类型,并且将其设置None为SVG。