2017-05-03 4 views
1

Dans mon modèle, je souhaite utiliser un validateur pour analyser le contenu d'un fichier. Ce que je n'arrive pas à comprendre, c'est comment accéder au contenu du fichier pour l'analyser en tant que le fichier n'a pas encore été enregistré (ce qui est bien) lorsque les validateurs sont en cours d'exécution.Comment utiliser les validateurs sur le contenu FileField

Je ne comprends pas comment obtenir les données de la 'valeur' ​​passée au validateur dans un fichier (je suppose que je devrais utiliser le fichier temporaire) afin que je puisse l'ouvrir et évaluer les données.

Voici un exemple simplifié, dans mon vrai code, je veux ouvrir le fichier et l'évaluer avec csv.

dans Models.py

class ValidateFile(object): 
    .... 
    def __call__(self, value): 
     # value is the fieldfile object but its not saved 
     # I believe I need to do something like: 
     temp_file - tempfile.TemporaryFile() 
     temp_file.write(value.read()) 
     # Check the data in temp_file 
    .... 

class MyItems(models.Model): 
    data = models.FileField(upload_to=get_upload_path, 
          validators=[FileExtensionValidator(allowed_extensions=['cv']), 
          ValidateFile()]) 

Merci pour l'aide!

Répondre

1

Jetez un coup d'œil comment cela se fait dans la mise en œuvre ImageField:

donc votre classe ValidateFile peut être quelque chose comme ceci:

from io import BytesIO 

class ValidateFile(object): 

    def __call__(self, value): 
     if value is None: 
      #do something when None 
      return None 

     if hasattr(value, 'temporary_file_path'): 
      file = value.temporary_file_path() 
     else: 
      if hasattr(value, 'read'): 
       file = BytesIO(value.read()) 
      else: 
       file = BytesIO(value['content']) 

     #Now validate your file