覆盖 Django ImageField 扩展验证

Override Djange ImageField extension validation

了解我可以向 Django 的 ImageField 验证器添加一个验证器来限制文件扩展名类型,如下所示。但就通过管理员上传显示的错误消息而言——如果我上传非图像类型,我仍然看到标准文件类型列表(通过 PIL 允许的类型)。如果我上传的图像类型不在下面的自定义 allowed_extensions 中,我会看到我的自定义消息。我如何覆盖 Django 的默认 ImageField 处理,并显示我的自定义错误消息,无论上传什么类型的文件(例如,当根据以下示例上传除 .png 以外的任何文件时)?

class MM(models.Model):
    file_extension_validator = FileExtensionValidator(
        allowed_extensions=['png'],
        message='File extension not allowed. Allowed extensions include  .png'
    )

    image = models.ImageField(
        help_text='Upload images only (.png).',
        validators=[file_extension_validator],
        max_length=255,
        blank=False,
        null=False
    )

问题不在于模型字段,而在于表单字段。表单字段有一个默认验证器,列出了 PIL 支持的所有扩展。

您可以制作一个特殊的表单字段 ModifiedImageField 并指定 ModelForm 将由 MyModelAdmin 在这种情况下使用:

from django.contrib import admin
from django.core.validators import FileExtensionValidator
from django import forms

<strong>image_validator</strong> = FileExtensionValidator(
    allowed_extensions=['png'],
    message='File extension not allowed. Allowed extensions include  .png'
)

class ModifiedImageField(forms.ImageField):
    default_validators = [<strong>image_validator</strong>]

class <strong>MyModelAdminForm</strong>(forms.ModelForm):
    <em>imagefield</em> = <strong>ModifiedImageField()</strong>

class MyModelAdmin(admin.ModelAdmin):
    form = <strong>MyModelAdminForm</strong>

其中 imagefield 是您要为其替换验证器的 ImageField 的名称。