覆盖保存方法 - “镜像文件”对象有没有属性“_committed”
问题描述:
我重写保存方法像下面,和get_thumbnails与SORL保存..覆盖保存方法 - “镜像文件”对象有没有属性“_committed”
但得到的错误'ImageFile' object has no attribute '_committed'
class HotelPhotos(models.Model):
hotel = models.ForeignKey(Hotel, related_name='photos')
code = models.CharField(max_length=255)
original = models.ImageField(upload_to="media")
medium = models.ImageField(upload_to="media", null=True, editable=False)
thumbnail = models.ImageField(upload_to="media", null=True, editable=False)
def save(self, *args, **kwargs):
super(HotelPhotos, self).save(*args, **kwargs)
self.medium = get_thumbnail(self.original,
'100x100',
crop='center',
quality=99)
self.thumbnail = get_thumbnail(self.original,
'50x50',
crop='center',
quality=99)
super(HotelPhotos, self).save(*args, **kwargs)
任何想法?
答
self.thumbnail = get_thumbnail(self.original,
'50x50',
crop='center',
quality=99).url
解决我的问题..
答
我最近发现一个类似的错误,通过Django管理更新的ImageField的内容时发生。
错误消息是:'InMemoryUploadedFile' 对象有没有属性 '_committed'
models.py:
class MyObject(models.Model):
name = models.CharField(max_length=80, unique=True, db_index=True)
slug = models.SlugField(max_length=80, unique=True, blank=False)
some_image = ImageField(upload_to='uploads/some/')
# ... deleted for brevity
这是不影响每一个模型,我缩小它下降到这个:
admin.py:
class MyObjectAdmin(admin.ModelAdmin):
# ...
def queryset(self, request):
return super(ShipAdmin, self).queryset(request).only('name', 'slug')
的解决方案是要么改变管理员查询集,像这样:
admin.py:
class MyObjectAdmin(admin.ModelAdmin):
# ...
def queryset(self, request):
return super(MyObjectAdmin, self).queryset(request).only('name', 'slug', 'some_image')
或者就是完全摆脱它,因为它是不真的需要/相关了。
保存或解决了您的问题? ;)P.S不要调用'super'保存方法两次。 'super'保存将返回一个实例,使用该实例来设置其他字段: 'instance = super(HotelPhotos,self).save(* args,** kwargs)' –
使用'.name'更好,因为' .url'也会包含MEDIA_URL,所以最终(如果你的MEDIA_URL不是空的话),你将进入/ media/media/cache/... –