ImageField не завершается с ошибкой IOError - PullRequest
0 голосов
/ 12 февраля 2010

Hay, у меня есть модель, которая сохраняет 2 изображения

class Picture(models.Model):
    picture = models.ImageField(upload_to=make_filename)
    thumbnail = models.ImageField(upload_to=make_thumb_filename)
    car = models.ForeignKey('Car')
    created_on = models.DateField(auto_now_add=True)
    updated_on = models.DateField(auto_now=True)

    def save(self):
        super(Picture, self).save()
        size = 200, 200
        filename = str(self.thumbnail.path)
        image = Image.open(filename)
        image.thumbnail(size, Image.ANTIALIAS)
        image.save(filename)

Как видите, я переписал метод save () На мой взгляд, у меня есть простая попытка, кроме блока, который проверяет IOErrors (которые возникают, если загружен файл, отличный от изображения)

def upload(request):
    car = Car.objects.get(pk=1)
    try:
        picture = Picture(picture=request.FILES['image'], thumbnail=request.FILES['image'], car=car)
        picture.save()
    except IOError:
        return HttpResponseRedirect("/test/")

Однако возникает исключение, но файлы по-прежнему записываются на сервер (и в БД)

Есть идеи, как сделать так, чтобы файлы не записывались при возникновении IOError?

EDIT

Исправлено написанием пользовательского метода

def is_accectable_file(filename):
    extension = filename.split('.')[-1]
    acceptable_filetypes = ['jpeg','jpeg','gif','png']
    if extension in acceptable_filetypes:
        return True
    else:
        return False

Затем выход из моей модели на

class Picture(models.Model):
    picture = models.ImageField(upload_to=make_filename)
    thumbnail = models.ImageField(upload_to=make_thumb_filename)
    car = models.ForeignKey('Car')
    created_on = models.DateField(auto_now_add=True)
    updated_on = models.DateField(auto_now=True)

    def save(self, *args, **kwargs):
        if is_accectable_file(self.picture.name):
            super(Picture, self).save(*args,**kwargs)
            size = 200, 200
            filename = str(self.thumbnail.path)
            image = Image.open(filename)
            image.thumbnail(size, Image.ANTIALIAS)
            image.save(filename)
            return True
        else:
            return False

и мой взгляд на

def upload(request):
    car = Car.objects.get(pk=1)
    try:
        picture = Picture(picture=request.FILES['image'], thumbnail=request.FILES['image'], car=car)
        if picture.save():
            return HttpResponse("fine")
        else:
            return HttpResponse("invalid type")
    except:
        return HttpResponse("no file")

1 Ответ

1 голос
/ 12 февраля 2010

Код, который (я предполагаю) генерирует IOError, запускается после , когда вы вызываете метод super(Picture,self).save(). Из-за этого картинка записывается в базу данных, даже если выдается исключение.

Вам просто нужно переместить вызов super после кода настройки.

В качестве отступления, если вы переопределяете save, я бы рекомендовал сделать это следующим образом:

def save(self,*args,**kwargs):
    ...
    super(Picture, self).save(*args,**kwargs)

В противном случае вы получите исключение в любом случае, когда Django передает аргументы save (и я считаю, что есть несколько случаев, когда это происходит, по крайней мере, для администратора).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...