2017-04-19 10 views
0

Djangoプロジェクトにファイルの検証を追加しようとしています。ファイルを解析するPythonライブラリを追加して追加する前に、ファイルサイズ、拡張子、およびコンテンツタイプを確認できるようにしたいと考えています。 forms.pyの私のモデルフォームのために私が持っている:私のビューのためのDjangoオーディオファイル形式の検証

class PostForm(forms.ModelForm): 

def clean_audio_file(self, form): 
    file = self.cleaned_data.get('sound') 


    if file: 
     if file._size > 4*1024*1024: 
      raise ValidationError("Audio file too large (> 4mb)") 
     if not file.content-type in ["audio/mpeg","audio/wav"]: 
      raise ValidationError("Content-Type is not mpeg") 
     if not os.path.splitext(file.name)[1] in [".mp3",".wav"]: 
      raise ValidationError("Doesn't have proper extension") 

      return file 
     else: 
      raise ValidationError("Couldn't read uploaded file") 

class Meta: 
    model = Places 
    fields = [ 

     'title', 
     'longitude', 
     'latitude', 
     'sound', 

    ] 

を、私が持っている:私は、ドキュメントを通じて数回行って、そして同様のファイルの例について見てきました

def post_create(request): 
form= PostForm(request.POST or None, request.FILES or None) 
form_class = PostForm() 

if form.is_valid():  
    instance = form.save(commit=False) 
    instance.save() 
    messages.success(request, 'Successfully Created') 
    return HttpResponseRedirect('/') 


context= { 
    'form': form, 
} 
return render(request, 'location/post_form.html',context) 

何らかの理由で私がアップロードしたファイルは検証されていません。フォームは期待どおりに動作しますが、検証エラーを発生させることなく、大きすぎるファイルタイプと不正確なファイルタイプを許可します。私が間違っているところのヒント?

答えて

1

clean_audio_file()はどこに呼ばれていますか?フォームは検証時にclean_{field name}()clean()を自動的に呼び出しますが、フィールド名はsoundと代わりに呼び出されます。それをまだ持っていないので、clean_sound()または単にclean()に名前を変更してください。

UploadedFile.size is a thingでも、あなたはなぜ_sizeを見ているのかわかりません。