Решено: как да съхранявате svgs в полето за изображение на django с SVGAndImageFormField

Основният проблем е, че svgs не се поддържат от полето за изображение на Django по подразбиране. Трябва да използвате персонализиран клас поле, за да съхранявате 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>

Това е персонализирано ImageField, което ви позволява да качите изображение или SVG.
Методът to_python взема данните от формуляра и ги преобразува във FileObject.
Ако данните вече са FileObject, той просто ги връща.
Ако данните имат атрибут за четене (т.е. ако са обект, подобен на файл), той ги връща.
Ако данните са празни (”), те връщат ” (това е така, защото празните полета за качване на файлове връщат None вместо ”, както другите полета).
Ако данните не са празни, той се опитва да ги отвори като файл (използвайки режима „rb“). Ако това успее, той връща файловия обект. Ако не, той просто връща самите данни (това е така, че формулярите, които може да очакват тези данни по-късно, да не се счупят).

Разрешаване на качване на SVG файлове в ImageField чрез Django admin

Ако искате да разрешите качването на SVG файлове в ImageField в Django, можете да го направите, като добавите следния ред към вашия файл settings.py:

IMAGE_FIELD_MAX_FILE_SIZE = 1000000

Как да съхранявате Svgs в полето за изображения на Django

Има няколко различни начина за съхраняване на svgs в Django. Най-лесният начин е да използвате класа ImageField. Този клас ви позволява да посочите URL или път към файла като стойност за полето.

Друг начин за съхраняване на svgs в Django е използването на класа ImageGallery. Този клас ви позволява да посочите URL или път към файла като стойност за полето и той автоматично ще генерира галерия от изображения въз основа на този път.

Подобни публикации:

Оставете коментар