1+ # -*- coding: utf-8 -*-
2+ from django import forms
3+ from django .core .exceptions import ValidationError
4+ from django .utils .translation import ugettext_lazy as _
5+
6+
7+ class MultiFileInput (forms .FileInput ):
8+ def render (self , name , value , attrs = None ):
9+ attrs ['multiple' ] = 'multiple'
10+ return super (MultiFileInput , self ).render (name , value , attrs )
11+
12+ def value_from_datadict (self , data , files , name ):
13+ if hasattr (files , 'getlist' ):
14+ return files .getlist (name )
15+ else :
16+ return [files .get (name )]
17+
18+
19+ class MultiFileField (forms .FileField ):
20+ widget = MultiFileInput
21+ default_error_messages = {
22+ 'min_num' : _ (u'Ensure at least %(min_num)s files are uploaded (received %(num_files)s).' ),
23+ 'max_num' : _ (u'Ensure at most %(max_num)s files are uploaded (received %(num_files)s).' ),
24+ 'file_size' : _ (u'File %(uploaded_file_name)s exceeded maximum upload size.' ),
25+ }
26+
27+ def __init__ (self , * args , ** kwargs ):
28+ self .min_num = kwargs .pop ('min_num' , 0 )
29+ self .max_num = kwargs .pop ('max_num' , None )
30+ self .maximum_file_size = kwargs .pop ('max_file_size' , None )
31+ super (MultiFileField , self ).__init__ (* args , ** kwargs )
32+
33+ def to_python (self , data ):
34+ ret = []
35+ for item in data :
36+ ret .append (super (MultiFileField , self ).to_python (item ))
37+ return ret
38+
39+ def validate (self , data ):
40+ super (MultiFileField , self ).validate (data )
41+ num_files = len (data )
42+ if len (data ) and not data [0 ]:
43+ num_files = 0
44+ if num_files < self .min_num :
45+ raise ValidationError (self .error_messages ['min_num' ] % {'min_num' : self .min_num , 'num_files' : num_files })
46+ elif self .max_num and num_files > self .max_num :
47+ raise ValidationError (self .error_messages ['max_num' ] % {'max_num' : self .max_num , 'num_files' : num_files })
48+ for uploaded_file in data :
49+ if uploaded_file .size > self .maximum_file_size :
50+ raise ValidationError (self .error_messages ['file_size' ] % { 'uploaded_file_name' : uploaded_file .name })
0 commit comments