Opgelost: hoe svgs op te slaan in het django-afbeeldingsveld met SVGAndImageFormField

Het grootste probleem is dat svgs niet worden ondersteund door het standaard Django-afbeeldingsveld. U moet een aangepaste veldklasse gebruiken om svgs op te slaan.

?

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>

Dit is een aangepast ImageField waarmee u een afbeelding of een SVG kunt uploaden.
De methode to_python haalt de gegevens uit het formulier en converteert deze naar een FileObject.
Als de gegevens al een FileObject zijn, wordt het gewoon geretourneerd.
Als de gegevens een leesattribuut hebben (dwz als het een bestandachtig object is), wordt dit geretourneerd.
Als de gegevens leeg zijn (""), retourneert het " (dit komt omdat lege velden voor het uploaden van bestanden Geen retourneren in plaats van ", zoals andere velden).
Als de gegevens niet leeg zijn, probeert het deze als een bestand te openen (met behulp van de 'rb'-modus). Als dit lukt, wordt het bestandsobject geretourneerd. Zo niet, dan retourneert het gewoon de gegevens zelf (dit is zodat formulieren die deze gegevens later zouden kunnen verwachten niet kapot gaan).

Sta toe dat SVG-bestanden worden geüpload naar ImageField via de Django-beheerder

Als u wilt toestaan ​​dat SVG-bestanden worden geüpload naar een ImageField in Django, kunt u dit doen door de volgende regel toe te voegen aan uw settings.py-bestand:

IMAGE_FIELD_MAX_FILE_SIZE = 1000000

Hoe Svgs op te slaan in het Django-beeldveld

Er zijn een paar verschillende manieren om svgs op te slaan in Django. De eenvoudigste manier is om de klasse ImageField te gebruiken. Met deze klasse kunt u een URL of bestandspad opgeven als waarde voor het veld.

Een andere manier om svgs in Django op te slaan, is door de klasse ImageGallery te gebruiken. Met deze klasse kunt u een URL of bestandspad specificeren als de waarde voor het veld, en het genereert automatisch een galerij met afbeeldingen op basis van dat pad.

Gerelateerde berichten:

Laat een bericht achter