2013-10-10 28 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