Saltar al contenido

Permitir que los archivos SVG se carguen en ImageField a través del administrador de Django

Nuestros mejores investigadores agotaron sus reservas de café, por su búsqueda diariamente por la solución, hasta que Perla halló el arreglo en Beanstalk así que ahora la comparte aquí.

Solución:

nunca he usado SVGAndImageFormField así que realmente no puedo comentar sobre eso. Personalmente hubiera optado por una simple aplicación de FileField, pero eso depende claramente de los requisitos del proyecto. Ampliaré eso a continuación:

Como se menciona en el comentario, la diferencia básica entre ImageField y FileField es que el primero verifica si un archivo es una imagen usando Pillow:

hereda todo attributes y métodos de FileField, pero también valida que el objeto cargado es una imagen válida.

Referencia: Documentos de Django, código fuente de Django

También ofrece un par de attributes posiblemente irrelevante para el caso de SVG (alto, ancho).

Por lo tanto, el campo del modelo podría ser:

    svg = models.FileField(upload_to=..., validators=[validate_svg])

Puedes usar una función como is_svg como se indica en la pregunta correspondiente:

¿Cómo puedo decir que un archivo es SVG sin usar un número mágico?

Luego una función para validar SVG:

def validate_svg(file, valid):
    if not is_svg(file):
        raise ValidationError("File not svg")

Resulta que SVGAndImageFormField no tiene dependencias en DRF ImageFieldsolo se suma a la validación realizada por django.forms.ImageField.

Entonces, para aceptar SVG en Django Admin I cambió el modelo ImageField a un FileField y especificó una anulación de la siguiente manera:

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)

Ahora acepta todos los formatos de imagen anteriores junto con SVG.

EDITAR: Acabo de descubrir que esto funciona incluso si no cambia de models.ImageField a models.FileField. los height y width attributes de models.ImageField seguirá funcionando para los tipos de imágenes de trama y se establecerá en None para SVG.

Sección de Reseñas y Valoraciones

Si entiendes que ha resultado útil este post, agradeceríamos que lo compartas con el resto seniors y nos ayudes a extender nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *