0

画像のアップロードにはdjangoとjqueryを使用しています。まず、アップローダーを使用して画像をアップロードします。画像はtmpbgimagefield に保存されます。次に、保存ボタンをクリックするtmpbgと、背景画像フィールドに移動します。ここで必要なのは、背景のイメージ フィールド パスにある孤立したイメージ ファイルを削除することです。

ここにコードがあります

Models.py:

class BackgroundModel(models.Model):
    user = models.OneToOneField(User)
    background = models.ImageField(upload_to='backgrounds', null=True, blank=True)
    tmpbg = models.ImageField(upload_to='backgrounds', null=True, blank=True)

class BackgroundModelForm(ModelForm):
    class Meta:
        model = BackgroundModel
        exclude = ('user', 'background')

Views.py (パス内の画像ファイルを削除するためのコード):

try:
    bg = BackgroundModel.objects.get(user=request.user)
except BackgroundModel.DoesNotExist:
    pass
else:
    if bg.background != '':
        image_path = os.path.join(settings.MEDIA_ROOT, str(bg.background))
        try:
            os.unlink(image_path)
            bg.BackgroundModel.delete()
        except:
            pass

    bg.background = bg.tmpbg
return HttpResponse("")

ただし、孤立したイメージファイルは削除されません。私はどんな間違いをしましたか?

アップデート:

この行に問題があります

bg.background=bg.tmpbg

シェルモードでチェックインしたとき。何も表示されません。

>>> g.background
<ImageFieldFile: None>

しかし、tmpbgに画像ファイルがあります

>>> g.background
<ImageFieldFile: backgrounds/ijkl.jpg>

では、あるイメージフィールドから別のフィールドにコピーするにはどうすればよいですか?

image_path コードの間は Correct! です。

4

3 に答える 3

1

モデルの削除メソッドをオーバーライドし、そこにファイルの削除を追加します。私は次のようなことをします:

class BackgroundModel(models.Model):
    ...

    def delete(self, using=None):
        os.unlink(self.tmpbg.path)
        super(BackgroundModel,self).delete()

私はコードをチェックしませんでしたが、このようなものはうまくいくはずです。そうでない場合は教えてください。:)

于 2012-04-29T16:42:03.990 に答える
1

で試してみてくださいos.normpath。これでうまくいくはずです:

 image_path = os.path.normpath(
     os.path.join(settings.MEDIA_ROOT, str(bg.background))
 )

アップデート :

try:
    bg = BackgroundModel.objects.get(user=request.user)
except BackgroundModel.DoesNotExist:
    pass
else:
    if bg.background != '':
        image_path = os.path.join(settings.MEDIA_ROOT, str(bg.background))
        try:
            os.unlink(image_path)
        except:
            pass

    bg.background = bg.tmpbg
    bg.save()
 return HttpResponse("")
于 2012-04-29T17:18:08.450 に答える
0

これを試して:

try:
    bg = BackgroundModel.objects.get(user=request.user)
except BackgroundModel.DoesNotExist:
    pass
else:
    if bg.background:
        file_to_delete = bg.background.path
        bg.background = bg.tmpbg
        bg.save()
        try:
            os.unlink(file_to_delete)
        except:
            pass
return HttpResponse()

ImageFileFieldまた、ファイルパスをコピーするだけに割り当てImageFileFieldます。

g.background = g.tmpbg
g.save()

g.background同じファイルをg.tmpbg指します。を通じてファイルが削除されるとg.backgroundg.tmpbgアクセスもできなくなります。この動作が望ましくない場合は、Django に新しいファイルに保存するように指示します。

from django.core.files.base import File
g.background = File(g.tmpbg)
g.save()
于 2012-04-29T19:53:58.797 に答える