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")