繁体   English   中英

验证时读取文件后,带有FileField的Django Model Admin无法读取save_model中的文件

[英]Django Model Admin with FileField cannot read file in save_model after reading file when validating

我有一个带FileField的模型,我想先读取文件的内容,然后再将其保存在Django管理员中。 我需要验证文件的格式是否正确,还要从中解析出版本信息并将其保存到模型中。 我已经编写了用于验证的代码,并且可以成功验证文件,但是在成功运行验证之后,似乎无法在save_object方法中保存文件的版本信息。 如果我跳过使用验证,则save_object方法中的代码将按预期工作,并且我可以读取文件内容并将版本信息保存到模型中。 我只是不能让他们同时工作。

# 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。

read()工作方式是使用您正在从文件中读取的位置指针。 因此,当您读取文件时,指针会移到文件的末尾,直到最后。 因此,再次调用read()不会返回任何内容,因为您现在指向的是文件末尾。

要再次读取文件,请首先使用seek(0) ,它将指针再次移至文件的开头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM