Vyřešeno: jak uložit svgs v poli obrázku django pomocí SVGAndImageFormField

Hlavním problémem je, že výchozí pole obrázku Django nepodporuje svgs. K ukládání svgs musíte použít vlastní třídu pole.

?

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>

Toto je vlastní ImageField, které vám umožňuje nahrát buď obrázek, nebo SVG.
Metoda to_python přebírá data z formuláře a převádí je na FileObject.
Pokud data již jsou FileObject, pouze je vrátí.
Pokud mají data atribut read (tj. pokud se jedná o objekt podobný souboru), vrátí jej.
Pokud jsou data prázdná (”), vrátí ” (je to proto, že prázdná pole pro nahrání souboru vrátí Žádné místo ”, jako ostatní pole).
Pokud data nejsou prázdná, pokusí se je otevřít jako soubor (pomocí režimu 'rb'). Pokud se to podaří, vrátí objekt souboru. Pokud ne, vrátí pouze samotná data (je to proto, aby se formuláře, které mohou tato data později očekávat, nerozbily).

Povolit nahrávání souborů SVG do ImageField prostřednictvím správce Django

Pokud chcete povolit nahrávání souborů SVG do ImageField v Django, můžete tak učinit přidáním následujícího řádku do souboru settings.py:

IMAGE_FIELD_MAX_FILE_SIZE = 1000000 XNUMX XNUMX

Jak uložit svgs v poli obrázku Django

Existuje několik různých způsobů, jak uložit svgs v Django. Nejjednodušší způsob je použít třídu ImageField. Tato třída umožňuje zadat URL nebo cestu k souboru jako hodnotu pole.

Dalším způsobem, jak uložit svgs v Django, je použít třídu ImageGallery. Tato třída vám umožňuje zadat URL nebo cestu k souboru jako hodnotu pro pole a na základě této cesty automaticky vygeneruje galerii obrázků.

Související příspěvky:

Zanechat komentář