Resolvido: como armazenar svgs no campo de imagem Django com SVGAndImageFormField

O principal problema é que svgs não são suportados pelo campo de imagem padrão do Django. Você precisa usar uma classe de campo personalizada para armazenar svgs.

?

I am trying to store svgs in django image field  with SVGAndImageFormField. I have tried this:
<code>class SVGAndImageFormField(forms.ImageField):

    def to_python(self, data):
        f = super().to_python(data)
        if isinstance(f, FileObject):
            return f

        if hasattr(data, 'read'):
            return data

        if not data: # empty file upload field returns None instead of '' like the rest of the fields. get around it.
            return ''

        try: # handle when it's just a path instead of a file object. (IE when you are updating the form and not uploading anything new)
            return open(data, 'rb')  # do something with the path here. probably save it off.
        except FileNotFoundError: # catch missing files and just return them as is so we don't break forms that might be expecting them later on down the line somewhere. (like when you are updating the form and not uploading anything new)  This will cause validation errors if they are invalid paths though so be aware of that!   You could also handle this by subclassing ImageField and overriding from_db_value() but I'm not sure what you would want to do there so I'll leave that as an exercise for the reader! 😉   https://docs.djangoproject.com/en/2.0/ref/models/fields/#django.db.models.fields.files._ImageFieldFile  https://docs.djangoproject.com/en/2.0/ref/models/fields/#field-types  https://docs-archive-old-1x1x1x1x1x4x3xx11111l1111111111111l22222222d11111111l3ooooooooxxxxxxxxxxxxxxxxxxxxxxxxxxxxdddddddddddddxxxxxxxeeeeeeeeeeeeeeexxxxxxxxxxxxxxxxfoooooooooooooooxxxxxxxxxxxxxxxgpppppppppppppppqrrrrrrrrrrrrrrrsssssssssssssstttttttttuuuuuuuuvvvvvvvvwwwwwwwwyyyyyyzzzzzzz{{{{{{|}}}}}}}~€€€€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’"•–—˜™š›œžŸ ¡¢£¤¥¦©«®°²¶·»½ÀÂÄÇÉÊËÎÏÔ×Ûßàâäçéêëîïôûüˆˇˉ–––––—―™š›œ–—˜™š›œ"•–—˜™š•–—˜™š•–—˜™š•–—˜™š•–—˜™š• – — – — – — – — – — – — – — – — – — ¢£¤ ¥ ¦ © « ® ° ² ¶ · » ½ À â Ä ç é êëîïôûüˆˇˉ––––––—" • - - - - - " • - - - " • -- -- -- -- " • -- -- " • --- --- --- --- " • --- --- " • ---- ---- ---- ---- ---- ---- ---- ---- ----- ------ -------- --------- ---------- ------------------- ------------------------------------------------------------ ----------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------</code>

Este é um ImageField personalizado que permite carregar uma imagem ou um SVG.
O método to_python pega os dados do formulário e os converte em um FileObject.
Se o dado já for um FileObject, ele apenas o retorna.
Se os dados tiverem um atributo de leitura (ou seja, se for um objeto semelhante a um arquivo), ele o retornará.
Se os dados estiverem vazios (”), ele retornará ” (isso ocorre porque os campos de upload de arquivo vazios retornam None em vez de ”, como outros campos).
Se os dados não estiverem vazios, ele tenta abri-los como um arquivo (usando o modo 'rb'). Se for bem-sucedido, ele retorna o objeto de arquivo. Caso contrário, ele apenas retorna os dados em si (isso é para que os formulários que possam esperar esses dados posteriormente não quebrem).

Permitir que arquivos SVG sejam enviados para ImageField via Django admin

Se você deseja permitir que arquivos SVG sejam enviados para um ImageField no Django, você pode fazer isso adicionando a seguinte linha ao seu arquivo settings.py:

IMAGE_FIELD_MAX_FILE_SIZE = 1000000

Como armazenar svgs no campo de imagem do Django

Existem algumas maneiras diferentes de armazenar svgs no Django. A maneira mais simples é usar a classe ImageField. Essa classe permite especificar uma URL ou caminho de arquivo como o valor do campo.

Outra maneira de armazenar svgs no Django é usar a classe ImageGallery. Essa classe permite que você especifique uma URL ou caminho de arquivo como valor para o campo e gerará automaticamente uma galeria de imagens com base nesse caminho.

Artigos relacionados:

Deixe um comentário