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を使用しています。
恐縮です、ありがとうございます!それは今すべての作品:) – Peconia