我创建了一个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
字段始终为False
(onchange
方法中除外)。
我试图在import_zip
方法的约束中获取其值...但是它返回False
。但是,在XML视图中显示字段filename
时,我可以在界面中看到文件名,并且文件名是正确的,并且会自动填写。
我在使用计算字段来处理文件名时遇到了一个丑陋的解决方法,但我想对此进行改进,并了解此处发生的情况。
有什么想法吗?谢谢!
答案 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"/>