2013-10-10 27 views
0

我想允许上传某些特定的文件类型。我为一个特定的文件编写了下面的代码,它工作。验证django中的多个文件

def validate_file_extension(value): 
    if not value.name.endswith('.zip'): 
     raise ValidationError(u'Error message') 

,但我想允许一个以上的文件,所以我在settings_dev设置这些文件,并写下了下面的代码,但不工作。

def validate_file_extension(value): 
    for f in settings_dev.TASK_UPLOAD_FILE_TYPES: 
     if not value.name.endswith(f): 
      raise ValidationError(u'Error message') 

Settings_dev

TASK_UPLOAD_FILE_TYPES=['.pdf','.zip','.docx'] 

型号:

up_stuff=models.FileField(upload_to="sellings",validators=[validate_file_extension]) 

我怎么能去呢?

回答

1

如果TASK_UPLOAD_FILE_TYPES中存在多个(不同)文件类型,则for循环将始终引发异常。因为任何一种文件类型都不匹配。

您不需要使用for,因为str.endswith接受元组作为参数。

>>> 'data.docx'.endswith(('.pdf','.zip','.docx')) 
True 
>>> 'data.py'.endswith(('.pdf','.zip','.docx')) 
False 

def validate_file_extension(value): 
    if not value.name.endswith(tuple(settings_dev.TASK_UPLOAD_FILE_TYPES)): 
     raise ValidationError(u'Error message') 
+0

谢谢你摇滚!但是你认为像这样访问文件是有效的吗?我尝试过使用python魔法,但在windows上遇到困难时,它一直告诉我“找不到神奇的文件”任何想法? – picomon

+0

@picpic,什么是** python magic **? – falsetru

+0

@picomon,或者你可以将'TASK_UPLOAD_FILE_TYPES'定义为['set'](http://docs.python.org/2/library/stdtypes#set)。然后在'validate_file_extension'中使用['os.path.splitext'](http://docs.python.org/2/library/os.path.html#os.path.splitext)来分割扩展名; 'TASK_UPLOAD_FILE_TYPES'中的扩展名会给出相同的结果。如果存在巨大的文件类型,这种方式可能会略微高效。 – falsetru