Løst: hvordan lagre svgs i django-bildefeltet med SVGAndImageFormField

Hovedproblemet er at svgs ikke støttes av standard Django-bildefelt. Du må bruke en egendefinert feltklasse for å lagre 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>

Dette er et tilpasset bildefelt som lar deg laste opp enten et bilde eller en SVG.
To_python-metoden tar dataene fra skjemaet og konverterer dem til et FileObject.
Hvis dataene allerede er et FileObject, returnerer de dem bare.
Hvis dataene har et leseattributt (dvs. hvis det er et fillignende objekt), returnerer det det.
Hvis dataene er tomme ("), returnerer de " (dette er fordi tomme filopplastingsfelt returnerer Ingen i stedet for ", som andre felt).
Hvis dataene ikke er tomme, prøver den å åpne dem som en fil (ved å bruke 'rb'-modus). Hvis dette lykkes, returnerer det filobjektet. Hvis ikke, returnerer den bare dataene selv (dette er slik at skjemaer som kan forvente disse dataene senere ikke går i stykker).

Tillat at SVG-filer lastes opp til ImageField via Django admin

Hvis du vil tillate at SVG-filer lastes opp til et ImageField i Django, kan du gjøre det ved å legge til følgende linje i filen settings.py:

IMAGE_FIELD_MAX_FILE_SIZE = 1000000

Slik lagrer du svgs i Django-bildefeltet

Det er noen forskjellige måter å lagre svgs på i Django. Den enkleste måten er å bruke ImageField-klassen. Denne klassen lar deg spesifisere en URL eller filbane som verdien for feltet.

En annen måte å lagre svgs i Django er å bruke ImageGallery-klassen. Denne klassen lar deg spesifisere en URL eller filbane som verdien for feltet, og den vil automatisk generere et galleri med bilder basert på den banen.

Relaterte innlegg:

Legg igjen en kommentar