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

Guy*_*den 1 django django-admin

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

它还依赖于表单中的另一个值,所以我在 formsclean方法中验证它:

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

该文件上传完美无缺。

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

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

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

这一切都在 django admin 中——据我所知,表单正在被正确处理。

kar*_*ikr 5

由于您使用 读取了一次文件.read(),因此文件指针不会指向文件的末尾。如果您要再次阅读它,则必须重置它。

你可以用seek()函数来做到这一点。

因此,无论是read()在in方法之后clean还是在read()insave方法之前,请执行

csv_file.seek(0)
Run Code Online (Sandbox Code Playgroud)

这里有更多信息