姜戈。覆盖模型保存

新手上路,请多包涵

在保存模型之前,我要重新调整图片的大小。但是我如何检查是否添加了新图片或只是更新了描述,这样我就可以在每次保存模型时跳过重新缩放?

 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)

我只想在加载新图像或更新图像时重新缩放,而不是在更新描述时重新缩放。

原文由 Pol 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 267
2 个回答

一些想法:

 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)

不确定它是否适用于所有伪自动 django 工具(例如:ModelForm、contrib.admin 等)。

原文由 petraszd 发布,翻译遵循 CC BY-SA 3.0 许可协议

检查模型的 pk 字段。如果它是 None,那么它是一个新对象。

 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)

编辑:我在 form.changed_data 中添加了“图像”检查。这假设您正在使用管理站点来更新您的图像。您还必须覆盖默认的 save_model 方法,如下所示。

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

原文由 DM Graves 发布,翻译遵循 CC BY-SA 2.5 许可协议

推荐问题