5

私はこのようなモデルを持っています:

class Talk(BaseModel):
  title        = models.CharField(max_length=200)
  mp3          = models.FileField(upload_to = u'talks/', max_length=200)
  seconds      = models.IntegerField(blank = True, null = True)

次のように、アップロードされたファイルが MP3 であることを保存する前に検証したい:

def is_mp3(path_to_file):
  from mutagen.mp3 import MP3
  audio = MP3(path_to_file)
  return not audio.info.sketchy

MP3 を取得したことを確認したら、トークの長さを次のように seconds 属性に保存します。

audio = MP3(path_to_file)
self.seconds = audio.info.length

問題は、保存する前に、アップロードされたファイルにパスがないことです (このチケットを参照してくださいwontfix

ModelForms が役立つエラー (「ばか、MP3 をアップロードしていません」など) を表示できるように、素敵な検証エラーを発生させたいと思います。

保存する前にファイルにアクセスする方法を教えてください。

psファイルを検証するより良い方法がMP3であることを誰かが知っているなら、私はすべて耳にします-ID3データをいじりたいと思っています(アーティスト、アルバム、タイトル、そしておそらくアルバムアートを設定するので、処理可能にする必要があります変異原による)。

4

3 に答える 3

10

ビュー内でrequest.FILESのファイルデータにアクセスできます。

アップロードしたファイルをフォームにバインドし、フォームのcleanメソッドをオーバーライドし、cleaned_dataから UploadedFileオブジェクトを取得し、必要に応じて検証してから、 saveメソッドをオーバーライドして、モデルインスタンスにファイルに関する情報を入力するのが最善の方法だと思います。それを保存。

于 2010-05-09T19:25:44.280 に答える
1

保存する前にファイルを取得するためのよりクリーンな方法は次のとおりです。

from django.core.exceptions import ValidationError

#this go in your class Model
def clean(self):
    try:
        f = self.mp3.file #the file in Memory
    except ValueError:
        raise ValidationError("A File is needed")
    f.__class__ #this prints <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
    processfile(f)

パスが必要な場合、その答えはこの別の質問にあります

于 2011-03-30T23:07:52.023 に答える