我正在尝试验证上传到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中 - 据我所知,表格正在正确处理。
答案 0 :(得分:4)
由于您使用.read()
读取文件一次,因此文件指针不会指向文件的末尾。如果你再读一遍,你将不得不重置它。
您可以使用seek()
function。
因此,在read()
之后的clean
或read()
方法中的save
之前,请执行
csv_file.seek(0)