为什么在Odoo 9的瞬态模型中缺少二进制文件名字段?

时间:2019-02-26 11:46:06

标签: python xml python-2.7 odoo odoo-9

我创建了一个TransientModel,它具有一个期望ZIP文件的二进制字段,因此我想使用其文件名来检查用户上传的文件是否实际上是一个ZIP文件。所以我一如既往:

代码

XML

<field name="filename" invisible="0"/>
<field name="source_file" widget="binary" filename="filename"/>

<button name="import_zip" string="Import" type="object" class="oe_highlight"/>

Python 2.7

class EasyImport(models.TransientModel):
    _name = 'easy.import'

    source_file = fields.Binary(
        string='Choose a ZIP File',
        required=True,
    )
    filename = fields.Char(
        string='Filename',
        readonly=True,
        required=True,
    )

    @api.onchange('filename')
    def onchange_filename(self):
        _logger.critical(self.filename)  # Returns the filename OK

    @api.multi
    def import_zip(self):
        self.ensure_one()
        _logger.critical(self.filename)  # Returns False

目的

拒绝非ZIP文件。或者至少,请阅读字段filename

问题

filename字段始终为Falseonchange方法中除外)。

我试图在import_zip方法的约束中获取其值...但是它返回False。但是,在XML视图中显示字段filename时,我可以在界面中看到文件名,并且文件名是正确的,并且会自动填写。

我在使用计算字段来处理文件名时遇到了一个丑陋的解决方法,但我想对此进行改进,并了解此处发生的情况。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

问题与瞬态模型,二进制字段或任何这些都不相关。

字段filename是只读字段,我刚刚意识到将只读字段与onchange方法结合使用会发生什么情况,我认为Odoo存在一个大错误,至少没有修复-至少在版本9-:

  

如果您在onchange事件中修改了只读字段,则可以正常工作   其新值,直到保存记录。发生这种情况时,   新值变成旧值,使用它的每种方法都会   获取旧值。

在我的情况下,我在filename方法中看到onchange正常,因为未保存记录,但是当我单击执行import_zip方法的按钮时,才执行记录内容,则记录被存储,并且由于Odoo错误,filename的值已替换为其旧值(始终为False)。

因此,基本上,解决方案是不将字段fieldname设为只读:

filename = fields.Char(
    string='Filename',
    readonly=False,
    required=True,
)

在XML中使其不可见,以避免出现不一致之处:

<field name="filename" invisible="1"/>