为什么 Odoo 9 的瞬态模型中缺少二进制文件名字段?
Why a binary filename field is missing in a Transient Model in 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
字段始终是 False
(onchange
方法除外)。
我试图在 import_zip
方法中的约束中获取它的值...但它 returns False
。但是,当我在 XML 视图中显示字段 filename
时,我可以在界面中看到文件名,它是正确的并自动填充。
我有一个丑陋的解决方法,使用计算字段来处理文件名,但我想改进它并知道这里发生了什么。
有什么想法吗?谢谢!
该问题与瞬态模型、二进制场或任何其他模型均无关。
字段 filename
是只读的,我刚刚意识到只读字段与 onchange
方法相结合发生了什么,Odoo 中存在一个很大的错误,在我看来,仍然没有修复 -至少在版本 9-:
If you modify a readonly field in an onchange
event, you can work OK
with its new value until you save the record. When this happens, the
new value turns into the old one, and every method which uses it will
get the old value.
在我的例子中,我在 onchange
方法中看到 filename
OK 因为记录没有保存,但是当我点击执行 import_zip
方法的按钮时,之前执行其内容,记录被存储,并且由于 Odoo 错误,filename
值被其旧值替换(始终为 False
)。
所以基本上解决方案是使字段不只读 fieldname
:
filename = fields.Char(
string='Filename',
readonly=False,
required=True,
)
并在 XML 中使其不可见以避免不一致:
<field name="filename" invisible="1"/>
我创建了一个 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
方法中的约束中获取它的值...但它 returns False
。但是,当我在 XML 视图中显示字段 filename
时,我可以在界面中看到文件名,它是正确的并自动填充。
我有一个丑陋的解决方法,使用计算字段来处理文件名,但我想改进它并知道这里发生了什么。
有什么想法吗?谢谢!
该问题与瞬态模型、二进制场或任何其他模型均无关。
字段 filename
是只读的,我刚刚意识到只读字段与 onchange
方法相结合发生了什么,Odoo 中存在一个很大的错误,在我看来,仍然没有修复 -至少在版本 9-:
If you modify a readonly field in an
onchange
event, you can work OK with its new value until you save the record. When this happens, the new value turns into the old one, and every method which uses it will get the old value.
在我的例子中,我在 onchange
方法中看到 filename
OK 因为记录没有保存,但是当我点击执行 import_zip
方法的按钮时,之前执行其内容,记录被存储,并且由于 Odoo 错误,filename
值被其旧值替换(始终为 False
)。
所以基本上解决方案是使字段不只读 fieldname
:
filename = fields.Char(
string='Filename',
readonly=False,
required=True,
)
并在 XML 中使其不可见以避免不一致:
<field name="filename" invisible="1"/>