我的表单中有 ImageField。正如我发现的,它使用枕头来验证该文件实际上是一个图像。这部分很棒,但我也需要在此表单字段中允许 pdf。
所以它应该检查文件是否是图像,如果不是,则检查它是否是pdf,然后加载并存储。
如果 pdf 检查能够真正检查文件格式,那就太好了,但仅扩展名检查也足够了。
如果你使用的话你就不能这样做forms.ImageField
以你的形式。你需要使用forms.FileField
因为ImageField
仅验证图像并引发ValidationError
如果文件不是图像。
这是一个例子:
模型.py
class MyModel(models.Model):
image = models.ImageField(upload_to='images')
forms.py
import os
from django import forms
from .models import MyModel
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['image']
image = forms.FileField()
def clean_image(self):
uploaded_file = self.cleaned_data['image']
try:
# create an ImageField instance
im = forms.ImageField()
# now check if the file is a valid image
im.to_python(uploaded_file)
except forms.ValidationError:
# file is not a valid image;
# so check if it's a pdf
name, ext = os.path.splitext(uploaded_file.name)
if ext not in ['.pdf', '.PDF']:
raise forms.ValidationError("Only images and PDF files allowed")
return uploaded_file
虽然上面的代码正确验证了图像的有效性(通过调用ImageField.to_python()
方法),但要确定文件是否为 PDF,它仅检查文件扩展名。要实际验证 PDF 是否有效,您可以尝试解决此问题:检查 PDF 文件是否有效 (Python) https://stackoverflow.com/questions/559096/check-whether-a-pdf-file-is-valid-python。这种方法尝试读取内存中的整个文件,如果文件太大,它可能会耗尽服务器的内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)