Λύθηκε: πώς να αποθηκεύσετε 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, απλώς τα επιστρέφει.
Εάν τα δεδομένα έχουν μια ιδιότητα ανάγνωσης (δηλαδή εάν είναι αντικείμενο που μοιάζει με αρχείο), το επιστρέφει.
Εάν τα δεδομένα είναι άδεια (”), επιστρέφουν ” (αυτό συμβαίνει επειδή τα κενά πεδία μεταφόρτωσης αρχείων επιστρέφουν Κανένα αντί για ”, όπως άλλα πεδία).
Εάν τα δεδομένα δεν είναι άδεια, προσπαθεί να τα ανοίξει ως αρχείο (χρησιμοποιώντας τη λειτουργία 'rb'). Εάν αυτό πετύχει, επιστρέφει το αντικείμενο αρχείου. Εάν όχι, απλώς επιστρέφει τα ίδια τα δεδομένα (αυτό γίνεται για να μην σπάσουν οι φόρμες που ενδέχεται να περιμένουν αυτά τα δεδομένα αργότερα).

Να επιτρέπεται η μεταφόρτωση αρχείων SVG στο ImageField μέσω του διαχειριστή του Django

Εάν θέλετε να επιτρέψετε τη μεταφόρτωση αρχείων SVG σε ένα ImageField στο Django, μπορείτε να το κάνετε προσθέτοντας την ακόλουθη γραμμή στο αρχείο settings.py:

IMAGE_FIELD_MAX_FILE_SIZE = 1000000

Πώς να αποθηκεύσετε Svgs στο πεδίο εικόνας Django

Υπάρχουν μερικοί διαφορετικοί τρόποι αποθήκευσης svgs στο Django. Ο απλούστερος τρόπος είναι να χρησιμοποιήσετε την κλάση ImageField. Αυτή η κλάση σάς επιτρέπει να καθορίσετε μια διεύθυνση URL ή μια διαδρομή αρχείου ως τιμή για το πεδίο.

Ένας άλλος τρόπος αποθήκευσης svgs στο Django είναι να χρησιμοποιήσετε την κλάση ImageGallery. Αυτή η κλάση σάς επιτρέπει να καθορίσετε μια διεύθυνση URL ή μια διαδρομή αρχείου ως τιμή για το πεδίο και θα δημιουργήσει αυτόματα μια συλλογή εικόνων με βάση αυτή τη διαδρομή.

Σχετικές αναρτήσεις:

Αφήστε ένα σχόλιο