Rozwiązany: jak przechowywać svgs w polu obrazu django za pomocą SVGAndImageFormField

Głównym problemem jest to, że svgs nie są obsługiwane przez domyślne pole obrazu Django. Musisz użyć niestandardowej klasy pola do przechowywania plików svg.

?

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>

To jest niestandardowe pole ImageField, które umożliwia przesłanie obrazu lub pliku SVG.
Metoda to_python pobiera dane z formularza i konwertuje je na obiekt FileObject.
Jeśli dane są już obiektem FileObject, po prostu je zwraca.
Jeśli dane mają atrybut read (tj. jeśli są to obiekty podobne do plików), zwracają je.
Jeśli dane są puste (”), zwracane jest ” (ponieważ puste pola przesyłania plików zwracają Brak zamiast ”, podobnie jak inne pola).
Jeśli dane nie są puste, próbuje otworzyć je jako plik (używając trybu „rb”). Jeśli to się powiedzie, zwraca obiekt pliku. Jeśli nie, po prostu zwraca same dane (dzięki temu formularze, które mogą później oczekiwać tych danych, nie psują się).

Zezwalaj na przesyłanie plików SVG do ImageField przez administratora Django

Jeśli chcesz zezwolić na przesyłanie plików SVG do pola ImageField w Django, możesz to zrobić, dodając następujący wiersz do pliku settings.py:

IMAGE_FIELD_MAX_FILE_SIZE = 1000000

Jak przechowywać pliki Svgs w polu obrazu Django

Istnieje kilka różnych sposobów przechowywania SVG w Django. Najprostszym sposobem jest użycie klasy ImageField. Ta klasa umożliwia określenie adresu URL lub ścieżki do pliku jako wartości pola.

Innym sposobem przechowywania plików SVG w Django jest użycie klasy ImageGallery. Ta klasa umożliwia określenie adresu URL lub ścieżki do pliku jako wartości pola i automatycznie wygeneruje galerię obrazów na podstawie tej ścieżki.

Powiązane posty:

Zostaw komentarz