Gelöst: So speichern Sie SVGs im Django-Bildfeld mit SVGAndImageFormField

Das Hauptproblem besteht darin, dass SVGs nicht vom standardmäßigen Django-Bildfeld unterstützt werden. Sie müssen eine benutzerdefinierte Feldklasse verwenden, um SVGs zu speichern.

?

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>

Dies ist ein benutzerdefiniertes ImageField, mit dem Sie entweder ein Bild oder ein SVG hochladen können.
Die Methode to_python nimmt die Daten aus dem Formular und konvertiert sie in ein FileObject.
Wenn die Daten bereits ein FileObject sind, wird es einfach zurückgegeben.
Wenn die Daten ein Leseattribut haben (dh wenn es sich um ein dateiähnliches Objekt handelt), wird es zurückgegeben.
Wenn die Daten leer sind (”), wird ” zurückgegeben (das liegt daran, dass leere Datei-Upload-Felder wie andere Felder None anstelle von ”, zurückgeben).
Wenn die Daten nicht leer sind, wird versucht, sie als Datei zu öffnen (unter Verwendung des 'rb'-Modus). Wenn dies erfolgreich ist, wird das Dateiobjekt zurückgegeben. Wenn nicht, werden nur die Daten selbst zurückgegeben (damit Formulare, die diese Daten später erwarten könnten, nicht beschädigt werden).

Ermöglicht das Hochladen von SVG-Dateien auf ImageField über den Django-Administrator

Wenn Sie zulassen möchten, dass SVG-Dateien in ein ImageField in Django hochgeladen werden, können Sie dies tun, indem Sie Ihrer settings.py-Datei die folgende Zeile hinzufügen:

IMAGE_FIELD_MAX_FILE_SIZE = 1000000

So speichern Sie SVGs im Django-Bildfeld

Es gibt verschiedene Möglichkeiten, SVGs in Django zu speichern. Der einfachste Weg ist die Verwendung der ImageField-Klasse. Mit dieser Klasse können Sie eine URL oder einen Dateipfad als Wert für das Feld angeben.

Eine andere Möglichkeit, SVGs in Django zu speichern, ist die Verwendung der ImageGallery-Klasse. Mit dieser Klasse können Sie eine URL oder einen Dateipfad als Wert für das Feld angeben, und es wird automatisch eine Galerie mit Bildern basierend auf diesem Pfad generiert.

Zusammenhängende Posts:

Hinterlasse einen Kommentar