如何限制具有FileFields的ModelForms的文件上传文件类型?

| 我的目标是将Django ModelForm上的FileField限制为PDF和Word文档。我用谷歌搜索的所有答案都与创建一个单独的文件处理程序有关,但是我不确定如何在ModelForm的上下文中这样做。我可以用来限制上传文件类型的settings.py中有设置吗?     
已邀请:
        我通过在ModelForm上使用clean_ [your_field]方法来处理此问题。您可以在settings.py中设置可接受的文件扩展名列表,以使用干净方法进行检查,但是settings.py内置没有任何限制上传类型的文件。 例如,Django-Filebrowser采用了在settings.py中创建可接受文件扩展名列表的方法。 希望对您有所帮助。     
        创建一个验证方法,例如:
def validate_file_extension(value):
    if not value.name.endswith(\'.pdf\'):
        raise ValidationError(u\'Error message\')
并将其包含在FileField验证器中,如下所示:
actual_file = models.FileField(upload_to=\'uploaded_files\', validators=[validate_file_extension])
此外,您应该手动设置模型并对其进行迭代,而不是手动设置模型允许的扩展名。 编辑 要过滤多个文件:
def validate_file_extension(value):
  import os
  ext = os.path.splitext(value.name)[1]
  valid_extensions = [\'.pdf\',\'.doc\',\'.docx\']
  if not ext in valid_extensions:
    raise ValidationError(u\'File not supported!\')
    
        用文件名的扩展名验证不是一致的方法。例如,我可以将picture.jpg重命名为picture.pdf,并且验证不会引起错误。 更好的方法是检查文件的content_type。 验证方法
def validate_file_extension(value):
    if value.file.content_type != \'application/pdf\':
        raise ValidationError(u\'Error message\')
用法
actual_file = models.FileField(upload_to=\'uploaded_files\', validators=[validate_file_extension])
    
        简便的方法如下表所示
file = forms.FileField(widget=forms.FileInput(attrs={\'accept\':\'application/pdf\'}))
    
        为了更通用,我写了一个小类
ExtensionValidator
来扩展Django内置的built7ѭ。它接受单个或多个扩展名,以及可选的自定义错误消息。
class ExtensionValidator(RegexValidator):
    def __init__(self, extensions, message=None):
        if not hasattr(extensions, \'__iter__\'):
            extensions = [extensions]
        regex = \'\\.(%s)$\' % \'|\'.join(extensions)
        if message is None:
            message = \'File type not supported. Accepted types are: %s.\' % \', \'.join(extensions)
        super(ExtensionValidator, self).__init__(regex, message)

    def __call__(self, value):
        super(ExtensionValidator, self).__call__(value.name)
现在,您可以在该字段中内联定义一个验证器,例如:
my_file = models.FileField(\'My file\', validators=[ExtensionValidator([\'pdf\', \'doc\', \'docx\'])])
    
        我沿这些方向使用一些东西(注意,为此需要\“ pip install filemagic \”):
import magic
def validate_mime_type(value):
    supported_types=[\'application/pdf\',]
    with magic.Magic(flags=magic.MAGIC_MIME_TYPE) as m:
        mime_type=m.id_buffer(value.file.read(1024))
        value.file.seek(0)
    if mime_type not in supported_types:
        raise ValidationError(u\'Unsupported file type.\')
您可能还可以将前面的示例合并到其中-例如,还要检查扩展名/上载的类型(作为主要检查,可能比魔术更快)。这仍然不是万无一失的-但它会更好,因为它更加依赖文件中的数据,而不是浏览器提供的标题。 注意:这是一个验证器函数,您想添加到FileField模型的验证器列表中。     

要回复问题请先登录注册