Đã giải quyết: cách lưu trữ svgs trong trường hình ảnh django với SVGAndImageFormField

Vấn đề chính là svss không được hỗ trợ bởi trường hình ảnh Django mặc định. Bạn cần sử dụng lớp trường tùy chỉnh để lưu trữ 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>

Đây là một ImageField tùy chỉnh cho phép bạn tải lên hình ảnh hoặc SVG.
Phương thức to_python lấy dữ liệu từ biểu mẫu và chuyển đổi nó thành FileObject.
Nếu dữ liệu đã là một FileObject, nó chỉ trả về nó.
Nếu dữ liệu có thuộc tính đọc (nghĩa là nếu nó là một đối tượng giống như tệp), nó sẽ trả về nó.
Nếu dữ liệu trống (“), nó sẽ trả về ” (điều này là do các trường tải lên tệp trống trả về Không thay vì ”, giống như các trường khác).
Nếu dữ liệu không trống, nó sẽ cố mở dưới dạng tệp (sử dụng chế độ 'rb'). Nếu điều này thành công, nó sẽ trả về đối tượng tệp. Nếu không, nó chỉ trả về chính dữ liệu đó (điều này là để các biểu mẫu có thể mong đợi dữ liệu này sau này không bị hỏng).

Cho phép các tệp SVG được tải lên ImageField thông qua quản trị viên Django

Nếu bạn muốn cho phép các tệp SVG được tải lên ImageField trong Django, bạn có thể làm như vậy bằng cách thêm dòng sau vào tệp settings.py của mình:

IMAGE_FIELD_MAX_FILE_SIZE = 1000000

Cách lưu trữ Svss trong trường hình ảnh Django

Có một vài cách khác nhau để lưu trữ svgs trong Django. Cách đơn giản nhất là sử dụng lớp ImageField. Lớp này cho phép bạn chỉ định một URL hoặc filepath làm giá trị cho trường.

Một cách khác để lưu trữ svgs trong Django là sử dụng lớp ImageGallery. Lớp này cho phép bạn chỉ định một URL hoặc đường dẫn tệp làm giá trị cho trường và nó sẽ tự động tạo một bộ sưu tập hình ảnh dựa trên đường dẫn đó.

bài viết liên quan:

Để lại một bình luận