переопределить метод сохранения - объект «ImageFile» не имеет атрибута «_committed»

Я переопределяю метод сохранения, как показано ниже, и get_thumbnails и сохраняю с помощью sorl..

Но получаю ошибку '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)

Любые идеи ?


person tuna    schedule 15.05.2013    source источник


Ответы (2)


self.thumbnail = get_thumbnail(self.original,
                                   '50x50',
                                   crop='center',
                                   quality=99).url

решил мою проблему..

person tuna    schedule 15.05.2013
comment
спасли или решили вашу проблему? ;) P.S. не вызывайте super метод сохранения дважды. super save вернет вам экземпляр, используйте этот экземпляр для установки дополнительных полей: instance = super(HotelPhotos, self).save(*args, **kwargs) - person Aamir Adnan; 15.05.2013
comment
Лучше использовать .name, так как .url также будет содержать MEDIA_URL, так что в итоге (если ваш MEDIA_URL не пустой) вы попадете в /media/media/cache/... - person Serj Zaharchenko; 03.05.2017

Недавно я обнаружил аналогичную ошибку, которая произошла при обновлении содержимого ImageField через администратора django.

Сообщение об ошибке: Объект 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')

Или просто полностью избавиться от него, так как он больше не нужен/актуален.

person Andrew Calder    schedule 26.01.2015