2010-11-24 188 views
83

在保存模型之前,我正在重新设置图片的大小。但是,如何检查新图片是否已添加或只是更新了描述,所以我可以在每次保存模型时跳过重新缩放?Django。覆盖保存模型

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) 

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

+0

你调整到100×100大小固定? – bdd 2010-11-24 17:23:57

+1

你可能会发现[django-imagekit](http://bitbucket.org/jdriscoll/django-imagekit/wiki/Home)有用 – vikingosegundo 2010-11-24 18:12:07

回答

91

的几点思考:

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等)。

1

使用相同的PK查询数据库中现有的记录。比较新图像和现有图像的文件大小和校验和,看它们是否相同。

5

您可能会提供用于确认发布新图像的额外参数。
喜欢的东西:

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) 

或通过请求变量

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) 

我觉得这不会破坏你的保存简称时。

你可以把这个在您的admin.py使之与网站管理员这项工作太(以上方案的第二个):

class ModelAdmin(admin.ModelAdmin): 

    .... 
    def save_model(self, request, obj, form, change): 
     instance = form.save(commit=False) 
     instance.save(request=request) 
     return instance 
+0

它告诉我:'WSGIRequest'对象没有属性'FILE' – Pol 2010-11-24 18:01:59

+0

如果把它放在管理员,因为你告诉... – Pol 2010-11-24 18:02:36

11

检查模型的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中添加了一个'image'检查。这假定您使用管理网站来更新您的图片。您还必须覆盖默认的save_model方法,如下所示。

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

我没有什么要达到的目标是使这个..

# I added an extra_command argument that defaults to blank 
def save(self, extra_command="", *args, **kwargs): 

和下方的保存()方法是这样的..

# override the save method to create an image thumbnail 
if self.image and extra_command != "skip creating photo thumbnail": 
    # your logic here 

所以,当我编辑的一些字段但没有编辑图像,我把这个..

Model.save("skip creating photo thumbnail") 

您可以用"im just editing the description"或更正式的文本替换"skip creating photo thumbnail"

希望这个帮助!

0

在新的版本是这样的:

def validate(self, attrs): 
    has_unknown_fields = set(self.initial_data) - set(self.fields.keys()) 
    if has_unknown_fields: 
     raise serializers.ValidationError("Do not send extra fields") 
    return attrs