2

我需要创建一个 ir.attachment 字段来由用户上传数据,但是我必须限制数据类型和大小,我该如何实现呢

我的 python 字段是:-

test = fields.Many2many('ir.attachment',string='Test')

4

1 回答 1

3

您可以使用约束来检查test字段。

使用mimetypefile_size字段检查数据类型和大小,many2many 列表中显示的附件大小是使用binaryToBinsize函数计算得出的,core/utils.js该函数将长度除以1.37然后将其转换为人体大小(重复除以 1024)。

例子:

强制用户只选择小于 10M 的文本文件

@api.one
@api.constrains('test')
def _check_attachments(self):
    for attachment in self.test:
        if attachment.mimetype != 'text/plain' or attachment.file_size > 10 * 1024 * 1024:
            raise ValidationError("Only text files smaller than 10M are allowed!")

为了防止用户使用测试字段列表创建不是小于 10M 的纯文本文件的附件:

通过file_sizemimetype在上下文中:

<field name="test" context="{'file_size': 10*1024*1024, 'mimetype': 'text/plain'}">

ir.attachment并在模型中添加约束。

例子:

def human_size(size):
    units = "Bytes,Kb,Mb,Gb,Tb,Pb,Eb,Zb,Yb".split(',')
    i = 0
    while size >= 1024:
        size /= 1024
        i += 1
    return "%.4g %s " % (size, units[i])


class IrAttachment(models.Model):
    _inherit = 'ir.attachment'

    @api.one
    @api.constrains('mimetype', 'file_size')
    def _check_mimetype_file_size(self):
        if 'mimetype' in  self.env.context and self.env.context['mimetype'] != self.mimetype:
            raise ValidationError("Only text files can be uploaded!")
        if 'file_size' in self.env.context and self.env.context['file_size'] < self.file_size:
            raise ValidationError("Only text files smaller than %s are allowed!" % human_size(self.env.context['file_size']))
于 2020-07-20T22:16:24.790 回答