我有一个包含文件字段的模型。我想将其限制为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,mime in form clean方法正确验证(打印'application / pdf')。但模型清洁方法没有验证。它将mime打印为'application / x-empty'。我在哪里做错了?
另外一个问题是,如果模型清理方法引发验证错误,则表单中不会显示为字段错误,但它显示为非字段错误。为什么这样?
答案 0 :(得分:2)
由于您使用的是表单验证,因此您不必担心模型清理方法
你已经在表单中做了正确的事情
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
您正在使用服务器端python-django验证,但javascript也是验证文件客户端的好方法。对于javascript正则表达式验证,您可以留意这个答案
https://stackoverflow.com/a/17067242/5518973
或者如果您能够使用插件,则可以使用jquery验证插件
答案 1 :(得分:0)
fields = '__all__'
Django两个独家新闻的建议:Django 1.8的最佳实践
26.14不要使用ModelForms.Meta.fields =“__ all __” - 这包括模型表单中的每个模型字段。这是一条捷径,也是一条危险的捷径。 它与我们在第26.13节(不要使用ModelForms.Meta.exclude)中描述的内容非常相似,甚至与 自定义验证代码,将项目公开给基于表单的批量分配 漏洞。我们主张避免这种技术 可能,因为我们认为根本无法捕捉所有 输入的变化。