我有一个包含文件字段的模型。我想将其限制为 pdf 文件。我在模型中编写了干净的方法,因为我还想检查管理和 shell 级别模型的创建。但它不适用于模型清理方法。然而,形式清洁方法正在发挥作用。
class mymodel(models.Model):
myfile = models.FileField()
def clean():
mime = magic.from_buffer(self.myfile.read(), mime=True)
print mime
if not mime == 'application/pdf':
raise ValidationError('File must be a PDF document')
class myform(forms.ModelForm):
class Meta:
model = mymodel
fields = '__all__'
def clean_myfile(self):
file = self.cleaned_data.get('myfile')
mime = magic.from_buffer(file.read(), mime=True)
print mime
if not mime == 'application/pdf':
raise forms.ValidationError('File must be a PDF document')
else:
return file
如果我上传 pdf,表单 clean 方法中的 mime 会正确验证(打印“application/pdf”)。但模型清理方法未验证。它将 mime 打印为“application/x-empty”。我哪里做错了?
还有一个问题是,如果模型清理方法引发验证错误,它不会在表单中显示为字段错误,而是显示为非字段错误。为什么这样 ?
由于您正在使用表单验证,因此您不必担心模型清理方法
你已经在形式上做了正确的事情
def clean_file(self):
yourfile = self.cleaned_data.get("your_filename_on_template", False)
filetype = magic.from_buffer(yourfile.read())
if not "application/pdf" in filetype:
raise ValidationError("File is not PDF.")
return yourfile
如果你想使用干净的模型,你可以制作自己的验证器
https://stackoverflow.com/a/27916582/5518973 https://stackoverflow.com/a/27916582/5518973
您正在使用服务器端 python-django 验证,但 javascript 也是验证文件客户端的好方法。对于 javascript 正则表达式验证,您可以查看此答案
https://stackoverflow.com/a/17067242/5518973 https://stackoverflow.com/a/17067242/5518973
或者如果您能够使用插件,您可以使用 jquery 验证插件
https://jqueryvalidation.org/ https://jqueryvalidation.org/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)