簡體   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