2016-11-27 30 views
0

私は画像のアップロードを処理する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 

答えて

0

私はいくつか愚かなデバッグに戻る時間がありました。

私の見解では、私は、このように充填だけidフィールドを持つ新しい写真オブジェクトに終わる。Photo.saveは()だったので

deletable = Photo(id=id) 

代わりの

deletable = Photo.objects.get(id=id) 

を行ってのですこれは私のDBで終わらず、エラーはスローされませんでした。このため、バグは私のレーダーの下で密かに飛んできました。最後に

deletable.delete() 

を呼び出すときに

はこのように、それだけで私は作成していたuncompleteインスタンスを削除しました。しかし、DBから適切なエントリも削除されました。これは私を捨てたもので、私は自分の手で正しいデータベースオブジェクトを持っていると思って、私はほとんどどこかで問題を探しました。

この動作は、私には不明なままです。 delete()は実際に問題のインスタンスを処理するのではなく、id(この場合は見つかったでしょう)のデータベースを実際にチェックしますか?私はdjango.db.models.Model.delete()を見てみると、これについていくつかの光を当てることができたと思います。

0

であることを、してみてください、注目に値するかもしれません:

path = p.imageField.path 

PSはい、大会に従うべきです。そうでなければ、誰かと共有したり、オープンソースプロジェクトに貢献したり、あなたの会社のプログラマーを雇うなど、他人があなたのコードを読むのは難しいでしょう。

+0

動作しません。編集番号3を参照してください。 – xtrom0rt

+0

@ xtrom0rtうーん、面白いです。それを試してみましょう。 – xyres

+0

ええ、それは変です。 instance.pkを実行すると、行の正しいプライマリキーが得られます。そのため、オブジェクトインスタンスに対して適切なハンドルを設定する必要があります。しかし、それは不思議な動作です。 – xtrom0rt

関連する問題