python - 扩展表单字段以添加新的验证

标签 python django oop django-forms

我编写了一个应用程序,它使用表单收集信息,然后通过电子邮件发送。其中许多表单都有一个文件字段,用于将文件附加到电子邮件。我想验证两件事,文件的大小(以确保我们的邮件服务器接受电子邮件。我还想检查文件扩展名,以阻止附加对我们的用户不可用的文件类型。

(这是我试图扩展的 python 类)

class FileField(Field):
    widget = FileInput
    default_error_messages = {
        'invalid': _(u"No file was submitted. Check the encoding type on the form."),
        'missing': _(u"No file was submitted."),
        'empty': _(u"The submitted file is empty."),
        'max_length': _(u'Ensure this filename has at most %(max)d characters (it has %(length)d).'),
    }

    def __init__(self, *args, **kwargs):
        self.max_length = kwargs.pop('max_length', None)
        super(FileField, self).__init__(*args, **kwargs)

    def clean(self, data, initial=None):
        super(FileField, self).clean(initial or data)
        if not self.required and data in EMPTY_VALUES:
            return None
        elif not data and initial:
            return initial

        # UploadedFile objects should have name and size attributes.
        try:
            file_name = data.name
            file_size = data.size
        except AttributeError:
            raise ValidationError(self.error_messages['invalid'])

        if self.max_length is not None and len(file_name) > self.max_length:
            error_values =  {'max': self.max_length, 'length': len(file_name)}
            raise ValidationError(self.error_messages['max_length'] % error_values)
        if not file_name:
            raise ValidationError(self.error_messages['invalid'])
        if not file_size:
            raise ValidationError(self.error_messages['empty'])
    return data

最佳答案

只需重载“clean”方法即可:

def clean(self, data, initial=None):
    try:
        if data.size > somesize:
            raise ValidationError('File is too big')

        (junk, ext) = os.path.splitext(data.name)
        if not ext in ('.jpg', '.gif', '.png'):
            raise ValidationError('Invalid file type')

    except AttributeError:
        raise ValidationError(self.error_messages['invalid'])

    return FileField.clean(self, data, initial)

关于python - 扩展表单字段以添加新的验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2733740/

相关文章:

python - XGBClassifier 的交叉验证,用于 python 中的多类分类

Python 3.6.2/Selenium 2.0/AJAX - 如何等待脚本结束服务器请求

Django REST Framework - 嵌套序列化程序验证?

python - 如果 __name__ == '__main__' 函数调用

python - 使用python ffmpeg转换视频文件时无法保存元数据

python - 带有额外字段的 Django ManyToMany 字段不会显示在两个关系上

python - 如何将Django OAuth Toolkit与Python Social Auth结合使用?

java - 在 Java 的 setter 中抛出 Exception 是一种好习惯吗?

php - 我想使用 DAO,但如何干净地注入(inject)返回的对象依赖项

c++ - 如何使用提取运算符从 C++ 中的类的方法中获取多个值?