0

在我的项目中,我有一个具有二进制属性(形状)的实体。如果用户在表单中为该形状属性上传了错误扩展名的文件,我想提出一条消息(validationError)。我该怎么做?

到目前为止我已经这样做了,但也没有工作

 shape = fields.Binary(string='Shape', required=True, attachment=True)
    shape_filename = fields.Char()

    def _check_file_extension(self, name, ext):
        if type(name) != bool:
            if not str(name).endswith(ext):
                return False
            return True
        return False

    @api.onchange('shape_filename')
    def _onchange_shape(self):
        if self.id and not self._check_file_extension(self.shape_filename,
                                                      '.zip'):
            raise ValidationError("Shape must be a .zip file ")

并且在视图中

   <field name="shape" widget="download_link" filename="shape_filename" options="{'filename': 'shape_filename'}"/>
   <field name="shape_filename" readonly="1"  invisible="1" force_save="1"/>
4

2 回答 2

1

该方法在包含表单中存在的值的伪记录上调用,我们只需要检查shape_filename字段值。

shape_filename字段是类型Char,当它有值时它应该是一个字符串。我们不需要将它转换为字符串。

空字符串在False测试真值时被考虑(type(name) != bool)。

附件属性的默认值为True

示例

def _check_file_extension(self, name, ext):
    if name:
        if not name.endswith(ext):
            return False
        return True
    return False

@api.onchange('shape_filename')
def _onchange_shape(self):
    if not self._check_file_extension(self.shape_filename, '.zip'):
        raise ValidationError("Shape must be a .zip file ")

onchange 方法可以简化为:

@api.onchange('shape_filename')
def _onchange_shape(self):
    if self.shape_filename and not self.shape_filename.endswith('.zip'):
        raise ValidationError("Shape must be a .zip file ")
于 2020-05-04T17:15:03.047 回答
0

对于常规文件名,您可以使用以下命令:

def _check_file_extension(name, ext):
    if name.split(".")[-1] != ext:
        return False
    return True
于 2020-05-04T04:29:50.530 回答