私は画像のアップロードを処理するDjangoとJSでソフトウェアの一部を作っています。ここまでは順調ですね。私はdropzone.jsからAJAX経由で素敵なイメージを得ています。それらはファイルシステムに保存され、PhotoFieldにImageFieldが格納され、保存されている場所と場所が記録されます。ImageFieldファイルのパスを取得するpost_delete
私はdropzone.jsを突き刺して、私のdevサーバーにデータベースエントリとファイル自体を削除するように頼んでもらえました。私は後者の部分が少し欠けていることがわかります。だから私は自分のフォトモデルからpost_deleteシグナルを捕まえ、ファイルシステムからの削除を処理するタスクを持つ関数を書くことにしました。問題は、私はデータベースに保存されているファイルパスに手を差し伸べる方法を見つけることができないということです。
私が正しく理解している場合、以下は動作するはずです:
from django.db import models
from django.db.models.signals import post_delete
from django.dispatch import receiver
class Photo(models.Model):
imageFile = models.ImageField(upload_to=generateImageFileNameAndPath)
@receiver(post_delete, sender=Photo)
def cleanupImageFiles(sender, **kwargs):
print("Cleanup called")
p = kwargs['instance']
path = p.imageFile.name
print(path)
しかし、私は、コンソールに出力path
しようとすると、何もありません。
Pythonの規約と思われるように、under_scoresを使用するのではなく、upperCasingについてごめんね。私は個人的にはアンダースコアのコンベンションに少し迷惑をかけることがあり、コンベンションに従うか、自分のやり方で行くかどうか、私の頭の中でレスリングの試合をしています。今のところ、私は後者をしました。
編集:私はp.imageFile.url
のどちらかとして動作させるように見えません。hereです。
editedit:imageFile.pathを呼び出して、カットしていません。私はまた、データがすでにダムだろうこれは、粉々に吹き飛ばされましたが、誰もが知っているpost_delete :)
EDIT3多分ことを考えpre_delete信号で試してみましたそれもどちらか。コンソールウィンドウには、
[27/Nov/2016 22:29:08] "POST /correcturl/upload/ HTTP/1.1" 200
Cleanup called
[27/Nov/2016 22:29:15] "DELETE /correcturl/upload/ HTTP/1.1" 500 37
が生成されます。 HTTPエラー500は、このコードが正しく動作していないため、ビューから削除呼び出しを処理できないだけです。これは私が現時点でフロントエンドへのステータスメッセージとして使用しているものです。 それはあなたがイメージのパスが必要な場合は、私が
print(p)
を行う場合は、コンソールに出力が
Photo object
動作しません。編集番号3を参照してください。 – xtrom0rt
@ xtrom0rtうーん、面白いです。それを試してみましょう。 – xyres
ええ、それは変です。 instance.pkを実行すると、行の正しいプライマリキーが得られます。そのため、オブジェクトインスタンスに対して適切なハンドルを設定する必要があります。しかし、それは不思議な動作です。 – xtrom0rt