Django. Overschrijven opslaan voor model

Voordat ik het model opsla, verklein ik het formaat van een afbeelding. Maar hoe kan ik controleren of er een nieuwe foto is toegevoegd of alleen de beschrijving is bijgewerkt, zodat ik het schalen kan overslaan telkens wanneer het model wordt opgeslagen?

class Model(model.Model):
    image=models.ImageField(upload_to='folder')
    thumb=models.ImageField(upload_to='folder')
    description=models.CharField()
    def save(self, *args, **kwargs):
        if self.image:
            small=rescale_image(self.image,width=100,height=100)
            self.image_small=SimpleUploadedFile(name,small_pic)
        super(Model, self).save(*args, **kwargs)

Ik wil alleen opnieuw schalen als een nieuwe afbeelding is geladen of een afbeelding is bijgewerkt, maar niet als de beschrijving is bijgewerkt.


Antwoord 1, autoriteit 100%

Enkele gedachten:

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
        # Or put whole logic in here
        small = rescale_image(self.image,width=100,height=100)
        self.image_small=SimpleUploadedFile(name,small_pic)
    def get_image(self):
        return self._image
    image = property(get_image, set_image)
    # this is not needed if small_image is created at set_image
    def save(self, *args, **kwargs):
        if getattr(self, '_image_changed', True):
            small=rescale_image(self.image,width=100,height=100)
            self.image_small=SimpleUploadedFile(name,small_pic)
        super(Model, self).save(*args, **kwargs)

Ik weet niet zeker of het goed zou werken met alle pseudo-automatische django-tools (voorbeeld: ModelForm, contrib.admin, enz.).


Antwoord 2, autoriteit 13%

Controleer het pk-veld van het model. Als het Geen is, dan is het een nieuw object.

class Model(model.Model):
    image=models.ImageField(upload_to='folder')
    thumb=models.ImageField(upload_to='folder')
    description=models.CharField()
    def save(self, *args, **kwargs):
        if 'form' in kwargs:
            form=kwargs['form']
        else:
            form=None
        if self.pk is None and form is not None and 'image' in form.changed_data:
            small=rescale_image(self.image,width=100,height=100)
            self.image_small=SimpleUploadedFile(name,small_pic)
        super(Model, self).save(*args, **kwargs)

Bewerken: ik heb een vinkje toegevoegd voor ‘afbeelding’ in form.changed_data. Dit veronderstelt dat u de beheerderssite gebruikt om uw afbeeldingen bij te werken. Je moet ook de standaard save_model-methode overschrijven, zoals hieronder aangegeven.

class ModelAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.save(form=form)

Antwoord 3, autoriteit 6%

U kunt een extra argument opgeven om te bevestigen dat er een nieuwe afbeelding is geplaatst.
Iets als:

def save(self, new_image=False, *args, **kwargs):
    if new_image:
        small=rescale_image(self.image,width=100,height=100)
        self.image_small=SimpleUploadedFile(name,small_pic)
    super(Model, self).save(*args, **kwargs)

of geef verzoekvariabele door

def save(self, request=False, *args, **kwargs):
    if request and request.FILES.get('image',False):
        small=rescale_image(self.image,width=100,height=100)
        self.image_small=SimpleUploadedFile(name,small_pic)
    super(Model, self).save(*args, **kwargs)

Ik denk dat deze je save niet kapot maken als je ze gewoon aanroept.

U kunt dit in uw admin.py plaatsen zodat dit ook met de admin-site werkt (voor de tweede van bovenstaande oplossingen):

class ModelAdmin(admin.ModelAdmin):
    ....
    def save_model(self, request, obj, form, change): 
        instance = form.save(commit=False)
        instance.save(request=request)
        return instance

4, Autoriteit 2%

Vraag de database op voor een bestaand record met dezelfde PK. Vergelijk de bestandsgroottes en checksums van de nieuwe en bestaande afbeeldingen om te zien of ze hetzelfde zijn.

Other episodes