4

私は最近、djangoを使って実験しています

モデル保存機能で imagemagick を介してアップロードされたファイルを実行できるようにしたいのですが、インスタンスが保存されるまでファイルが利用できないため、これは不可能であることに気付きました

最初に保存が呼び出され、アップロードされたファイルへのアクセスが許可され、他のフィールドにデータが入力されたら再保存されます。

これを達成するためのより良い方法はありますか?保存関数を2回呼び出すのはちょっと気分が悪い

class uploadedFiles(models.Model):
orignal_image = models.FileField(upload_to='userimages/')
user = models.ForeignKey(User)
description = models.TextField(blank=True)


def __unicode__(self,force_insert=False, force_update=False):
    return "%s uploaded by %s" % (self.orignal_image.path, self.user) 

def save(self, force_insert=False, force_update=False):
    super(uploadedFiles, self).save()
    s = ''
    cmd = subprocess.Popen(['identify', '-verbose', self.orignal_image.path], stdout=subprocess.PIPE)
    for line in cmd.stdout:
        s += line
    self.description = s
    super(uploadedFiles, self).save()
4

2 に答える 2

0

画像ライブラリ関数を使用して画像のメタデータを収集するとよいでしょう。FileStorage次に、画像フィールドのインスタンスから画像データを読み取る必要があります。ファイルのアップロードに関するドキュメントを確認してください。また、Django の を使用する場合ImageField、アップロードされたファイルが有効な画像ファイルであるかどうかをチェックしImageField、ベースラインとしてのコードをチェックして、画像に関する詳細情報を取得します。

モデルにメソッドを定義しますclean。これは、モデルのメソッドを呼び出す直前に呼び出されsaveます。で、イメージ フィールドのデータ ストリームを PIL 関数でチェックしてメタデータ (または、物理ファイルではなくcleanデータ ストリームを受け入れる限り、これに使用する任意のライブラリ) を取得し、説明フィールドに入力します。メタデータで。

Django の Storage API を使用する方が優れているため、ローカル ファイルシステムに保存されているファイルだけでなく、クラウド (Amazon S3 など) に保存されているファイルからメタデータを抽出できるため、デプロイ間でのコードの移植性が大幅に向上します。

于 2012-06-11T21:44:19.390 に答える
-1

Django のpre_saveシグナルを使用します ( docs 、Django のドキュメントのSignalsも参照してください)。

from django.db.models.signals import pre_save
from myapp.models import MyModel

def do_something(sender, **kwargs):
    pass
pre_save.connect(do_something, sender=MyModel)

Django は、オブジェクトdo_somethingを保存する前に呼び出すようになりました。MyModel

于 2012-06-10T15:26:21.860 に答える