2017-01-25 14 views
0

私は、ファイルの処理のために、この機能がありません:cleaned_dataからアップロードしたファイルの名前を取得する方法は?

def handle_uploaded_file(f, person): 
    with open(user_directory_path(person, f.name), 'w') as destination: 
     for chunk in f.chunks(): 
      destination.write(chunk) 

をそして私は方法の保存形式でこの関数を呼び出す:私ははAttributeErrorを持って

class CreateMessageForm(forms.Form): 
    files = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True})) 
    ... 
    def save(self): 
     ... 
     for file in cleaned_data.get('files'): 
      handle_uploaded_file(file, self.person) 
      message.files.add(file) 

をしかし、このフォームを送信した後に「バイト」オブジェクトには持っています属性名'。私は何が間違っているのか分からない。ドキュメントのuploadedfileオブジェクトには、この属性があります。

+0

htmlフォームに 'enctype =" multipart/form-data "を追加してください。 – itzMEonTV

+0

@itzmeontvすでに追加されています。申し訳ありませんが、私はそれについて書くかもしれません。 –

答えて

0

はここで何が起こるかですあなたは、それがuploadedFileオブジェクトのリストを反復し、それぞれをハンドラ関数に渡すことを期待しています。しかしcleaned_data['files']はあなたのためのリストではなく、ただ一つのuploadedfileのインスタンスです。ファイルオブジェクトを反復処理すると、実際にそのオブジェクトを読み込んでいます。だから最終的にハンドラ関数に渡すものは、ファイルオブジェクトではなく内容(バイト文字列)です。イテレートする前にリストをチェックするためにこの部分を書き直してください。それが単一のファイルの場合はそのまま渡します。

+0

はい、それは本当です。ありがとう。 –

0

あなたのHTML形式で試してみてください。

<form enctype="multipart/form-data" method="post" action="/foo/"> 
+0

既に追加されています。 –

0

私はあなたがあなたのフォームでFileFieldを使用することを示唆している:

class MyForm(forms.Form): 
    file = forms.FileField() 

とビューで、次の操作を行います。for file in self.cleaned_data["files"]:、 をあなたが実行すると:

def upload(request): 
    if request.method == 'POST': 
     if form.is_valid(): 
      form = MyForm(request.POST, request.FILES) 
      file = form.cleaned_data.get('file') 
      ... 
+0

私はこのフィールドに関する情報を追加しました。これらの操作をビューで転送すると、同じエラーが発生します。 –

+1

あなたが 'form.is_valid():'なら 'が不足しているので、cleaned_dataは利用できません。 –

+0

私は全く同意する、私は私の答えを編集する – afilardo

関連する問題