0

ヘイ、私は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/")

ただし、例外は発生しますが、ファイルは引き続きサーバー (および db) に書き込まれます。

IOError が発生した場合にファイルが書き込まれないようにする方法はありますか?

編集

カスタムメソッドを書くことで修正

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

1 に答える 1

1

メソッドを呼び出した、IOErrorをスローするコードが実行されていると思いますsuper(Picture,self).save()。このため、例外がスローされた場合でも、画像がデータベースに書き込まれます。

superコールをセットアップ コードの後に​​移動するだけです。

余談ですが、オーバーライドする場合はsave、次のようにすることをお勧めします。

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

そうしないと、Django が引数を渡す場合に必ず例外が発生しますsave(少なくとも管理者では、例外が発生する場合がいくつかあると思います)。

于 2010-02-12T14:45:51.113 に答える