Löst: hur man lagrar svgs i django-bildfält med SVGAndImageFormField

Det största problemet är att svgs inte stöds av standardbildfältet för Django. Du måste använda en anpassad fältklass för att lagra 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>

Detta är ett anpassat bildfält som låter dig ladda upp antingen en bild eller en SVG.
Metoden to_python tar data från formuläret och konverterar den till ett FileObject.
Om datan redan är ett FileObject returnerar det bara det.
Om datan har ett läsattribut (dvs. om det är ett filliknande objekt) returneras det.
Om informationen är tom (”), returnerar den ” (detta beror på att tomma filuppladdningsfält returnerar Ingen istället för ”, som andra fält).
Om informationen inte är tom försöker den öppna den som en fil (med "rb"-läget). Om detta lyckas returneras filobjektet. Om inte, returnerar den bara själva data (detta är så att formulär som kan förvänta sig dessa data senare inte går sönder).

Tillåt att SVG-filer laddas upp till ImageField via Django admin

Om du vill tillåta att SVG-filer laddas upp till ett ImageField i Django kan du göra det genom att lägga till följande rad i filen settings.py:

IMAGE_FIELD_MAX_FILE_SIZE = 1000000

Hur man lagrar svgs i Django Image Field

Det finns några olika sätt att lagra svgs i Django. Det enklaste sättet är att använda klassen ImageField. Den här klassen låter dig ange en URL eller filsökväg som värde för fältet.

Ett annat sätt att lagra svgs i Django är att använda klassen ImageGallery. Den här klassen låter dig ange en URL eller filsökväg som värde för fältet, och den genererar automatiskt ett galleri med bilder baserat på den sökvägen.

Relaterade inlägg:

Lämna en kommentar