上传到Django表单时验证文件内容

时间:2014-07-07 13:24:33

标签: django django-admin

我正在尝试验证上传到Django Admin的CSV文件 - 以确保其格式正确等等。

它还依赖于表单中的其他值,因此我在表单clean方法中验证它:

def clean(self):
    cleaned_data = super(CSVInlineForm, self).clean()
    csv_file = cleaned_data.get('csv_file')
    contents = csv_file.read()
    # ...validate contents here...
    return cleaned_data

我的模型保存方法如下所示:

def save(self, *args, **kwargs):
    contents = self.csv_file.read()
    # ... do something with the contents here ...
    return super(CSVModel, self).save(*args, **kwargs)

当我读取clean方法中的文件内容时出现问题,我无法读取模型save方法中的csv_file(它返回一个空字符串)。在clean方法中,我可以读取并解析文件。

文件上传完美无缺。

如果我在clean方法中注释掉csv_file.read()行,则save方法可以正常工作,并且可以读取文件内容。

它的行为好像文件只能读一次?

如果我重新保存模型,文件读取和解析工作正常。

这都在django admin中 - 据我所知,表格正在正确处理。

1 个答案:

答案 0 :(得分:4)

由于您使用.read()读取文件一次,因此文件指针不会指向文件的末尾。如果你再读一遍,你将不得不重置它。

您可以使用seek() function

执行此操作

因此,在read()之后的cleanread()方法中的save之前,请执行

csv_file.seek(0)

更多info here