Løst: hvordan man gemmer svgs i django billedfelt med SVGAndImageFormField

Hovedproblemet er, at svgs ikke understøttes af standard Django-billedfeltet. Du skal bruge en brugerdefineret feltklasse til at gemme 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 brugerdefineret billedfelt, der giver dig mulighed for at uploade enten et billede eller en SVG.
To_python-metoden tager dataene fra formularen og konverterer dem til et FileObject.
Hvis dataene allerede er et FileObject, returneres det bare.
Hvis dataene har en læseattribut (dvs. hvis det er et fillignende objekt), returnerer det det.
Hvis dataene er tomme ("), returnerer de " (dette skyldes, at tomme filoverførselsfelter returnerer Ingen i stedet for ", ligesom andre felter).
Hvis dataene ikke er tomme, forsøger den at åbne dem som en fil (ved hjælp af 'rb'-tilstanden). Hvis dette lykkes, returnerer det filobjektet. Hvis ikke, returnerer den bare selve dataene (dette er for at formularer, der muligvis forventer disse data senere, ikke går i stykker).

Tillad, at SVG-filer uploades til ImageField via Django admin

Hvis du vil tillade, at SVG-filer uploades til et ImageField i Django, kan du gøre det ved at tilføje følgende linje til filen settings.py:

IMAGE_FIELD_MAX_FILE_SIZE = 1000000

Sådan gemmer du svgs i Django billedfelt

Der er et par forskellige måder at gemme svgs på i Django. Den enkleste måde er at bruge ImageField-klassen. Denne klasse giver dig mulighed for at angive en URL eller filsti som værdien for feltet.

En anden måde at gemme svgs i Django er at bruge ImageGallery-klassen. Denne klasse giver dig mulighed for at angive en URL eller filsti som værdien for feltet, og den vil automatisk generere et galleri af billeder baseret på den sti.

Relaterede indlæg:

Efterlad en kommentar