2017-01-23 3 views
0

FileFieldを持つモデルがあり、ファイルの内容をDjango管理者に保存する前に読みたいと思います。ファイルが正しくフォーマットされていることを確認し、バージョン情報を解析してモデルに保存する必要があります。私は検証のためのコードを書いて正常にファイルを検証することができますが、私は正常に検証を実行した後save_objectメソッドでファイルからバージョン情報を保存することはできません。バリデーションをスキップすると、save_objectメソッドのコードが期待通りに機能し、ファイルの内容を読み込んでバージョン情報をモデルに保存できます。私はただ彼らが同時に両方の仕事をすることができません。DjangoモデルFileFieldの管理者は、検証時にファイルを読み込んだ後、save_modelのファイルを読み取れません。

# models.py: 

# the validation works 
def validate_file_contents(value): 
     contents = value.read() 
     first_line, rest_of_file = contents.split('\n', 1) 
     if not validate_file_format(rest_of_file): 
      raise ValidationError("File is not formatted correctly.") 
     if not parse_version(first_line): 
      raise ValidationError("The file does not contain correctly formatted version information.") 

class MyModel(models.Model): 
    file = models.FileField(validators=[validate_file_contents]) 
    version = models.CharField(max_length=100, null=True, blank=True) 

----------------------------------------------------------------------------------------------- 
# admin.py: 

class MyModelAdmin(admin.ModelAdmin): 
    fields = ['file',] 
    list_display = ['file', 'version'] 
    list_filter = ['file', 'version'] 

    def save_model(self, request, obj, form, change): 
     contents = request.FILES['file'].read() 
     # contents is empty after successful validation! It is not empty if validation is skipped. 

     first_line = contents.split('\n', 1)[0] 
     obj.version = parse_version(first_line) 
     obj.save() 

どのようにしてファイルを検証し、バージョン情報を保存できますか?私はDjango 1.10とPython 2.7を使用しています。

答えて

1

read()は、ファイルから読み取っている位置のポインタを使用するように機能します。ファイルを読むと、ポインタは最後まで移動します。したがって、ファイルの最後を指しているので、read()を再度呼び出すと何も返されません。

ファイルをもう一度読むには、seek(0)を最初に使用します。ポインタをファイルの先頭にもう一度移動します。

+0

恐縮です、ありがとうございます!それは今すべての作品:) – Peconia

関連する問題