[英]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.