Maison  >  Article  >  développement back-end  >  Quand remplacer l'enregistrement du modèle Django pour le redimensionnement de l'image

Quand remplacer l'enregistrement du modèle Django pour le redimensionnement de l'image

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-22 21:09:03412parcourir

When to Override Django Model Saving for Image Resizing

Remplacement de la sauvegarde du modèle Django pour des cas spécifiques

Dans Django, la méthode save() dans les modèles est responsable de la persistance des données dans la base de données. Cependant, il existe des scénarios dans lesquels vous souhaiterez peut-être modifier ce comportement en fonction de critères spécifiques. Un de ces cas est le redimensionnement d'une image uniquement lorsqu'elle est nouvellement ajoutée ou mise à jour.

Problème :

Dans un modèle avec des champs pour l'image, le pouce et la description, vous besoin de redimensionner et de stocker une vignette (pouce) uniquement si l'image principale (image) est créée ou modifiée. La mise à jour du champ de description ne devrait pas déclencher le redimensionnement de l'image.

Solution :

Pour y parvenir, vous pouvez remplacer la méthode save() par défaut en utilisant une propriété personnalisée qui vérifie pour les modifications dans le champ image :

<code class="python">class Model(model.Model):
    _image = models.ImageField(upload_to='folder')
    thumb = models.ImageField(upload_to='folder')
    description = models.CharField()

    def set_image(self, val):
        self._image = val
        self._image_changed = True

    def get_image(self):
        return self._image

    image = property(get_image, set_image)

    def save(self, *args, **kwargs):
        if getattr(self, '_image_changed', True):
            small = rescale_image(self.image, width=100, height=100)
            self.thumb = SimpleUploadedFile(name, small_pic)
        super(Model, self).save(*args, **kwargs)</code>

Comment ça marche :

  • La méthode set_image() met à jour le champ _image et définit un indicateur _image_changed sur True.
  • La méthode get_image() renvoie la valeur actuelle du champ _image.
  • La propriété image enveloppe à la fois les méthodes set_image() et get_image() pour fournir une interface cohérente.
  • Dans la méthode save() remplacée, l'indicateur _image_changed est vérifié. Si c'est True, cela signifie que l'image a été modifiée ou ajoutée.
  • Dans ce cas, la vignette est redimensionnée.
  • La méthode super() est appelée pour enregistrer le modèle dans la base de données avec la vignette redimensionnée (si nécessaire) et la description mise à jour.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn