2011-01-31 17 views
1

私はWordPressのやり方と同じように、さまざまな種類のメディア(画像、swfs、pdfs)をアップロードできる 'メディアマネージャ'モデルを作成しようとしています。ユーザーは、私が最初にそれがあり、それが画像だ場合は、さらにそれを操作するファイルの種類を決定したい、ファイルをアップロードするときDjango - FileFieldとimages

class Media(models.Model): 
    id = models.AutoField(primary_key=True) 
    url = models.FileField(upload_to="uploads") 
    mimetype = models.CharField(max_length=64, editable=False) 
    created = models.DateTimeField(auto_now_add=True, editable=False) 

:マイメディアモデルは次のようになります。アップロードされたイメージのサイズ(トリミング)をビューで指定できるようにするため、.save()メソッドを呼び出すと、モデルのサイズが変更され、イメージがトリミングされ、アップロードされ、URLがデータベースに設定されますファイルに追加します。

また、画像のアップロードが後処理(クロップなど)後に行われるようにしたいので、元のファイルを保持する必要はありません。

FileFieldsの保存メソッドにパラメータを渡す方法(画像の後処理のために動的プロパティを渡すことができる)と、画像がアップロードされる前に後処理が確実に行われるようにする方法を教えてください?

編集:イメージがアップロードされる前に私が言うとき、それは最終的な目的地に保存される前のことです。私はそれを処理することができます前に、画像が最初にint型のtmpフォルダに移動しなければならないことを理解しています。誤解を招くような質問を申し訳ありません。

ホープ誰かが助けることができます:)画像がアップロードされる前に、(あなたがで動作するように何もないので)あなたは何もできない

答えて

4

。あなたはデシベルにそれを保存する前に画像を変更したい場合は

しかし、あなたは親のsave()

あなたが管理者を経由して、それをアップロードする場合は、オーバーライドメソッドのsave_modelを(呼び出す前に、モデルのsave()メソッドでそれを行うことができます)、admin.py、すなわち:

def save_model(self, request, obj, form, change): 

     file = request.FILES.get('url') # name of field 
     if file: 
      # proceed your code 

     return super(AdminClassName, self).save_model(request, obj, form, change) 
+0

@tovmeod +1ユーザ名 – AllTradesJack

1

画像がアップロードされる前にどのように処理することができますか?それは意味をなさない。アップロードするまで、サーバーはファイルへのアクセス権を持ちません。

ファイルを保存する前に実際に処理したい場合は、custom upload handlerと書くことができます。ファイルが画像であるかどうかテストし、保存する前に適切にトリミングすることができます。 (これらのタスクの両方にPython Imaging Libraryが必要です。)

+0

あなたはメモリ内で編集できます。 check InMemoryUploadedFile – errx

+0

申し訳ありませんが、私は「画像が最終的な目的地に保存される前に」と言っていました。まずファイルをtmpフォルダにアップロードすることを前提としていました。私が求めていることは、すべてのチャンクがアップロードされたことを確認するために、画像に後処理を適用するべき段階は何ですか? – Hanpan

2

実際にアップロードする前にファイルを変更する方法はここにあります。私はあなたが私の考えを得るべきだと思う。

from django.core.files.uploadedfile import InMemoryUploadedFile 
#.... 
#some form 
     def clean_avatar(self): 
      av = self.cleaned_data['avatar'] 
      resized = make_avatar(av,65) # My custom function than returns image 
      return InMemoryUploadedFile(resized, av.field_name, av.name, av.content_type, resized.len, av.charset) 

InMemoryUploadedFile "documentation"のdjangoコードを読むことができます。 リサイズ/クロップ機能では、結果を保存するためにファイルではなくStringIOを使用する必要があります

関連する問題