Python 使用弹出窗口获取用户输入,并在OpenERP中的按钮功能中使用这些输入
我想请社区在OpenERP中评估我的解决方案。我用的是奥多v8 我创建了一个带有两个字段的弹出窗口,原始代码和替换代码,以及带有标题替换的按钮。弹出窗口从父页面“更多按钮”下拉选项启动 用例是用户将在“原始代码”字段中键入产品代码,该字段看起来像编辑文本框,而“替换代码”字段将自动填充并为只读。按下“替换”按钮将触发按钮操作,以替换数据库中相关表中的代码 我在数据库中创建了新模型、新类和新表nk_product_template,它继承自product_template。我创建新表的原因是让我的按钮操作将记录插入此表中,而不是产品模板表中。我在表中添加了两个新的字符字段,即原始_代码和替换代码。该模型在弹出窗口的XML代码中引用 My button action函数在nk_product_模板类中定义,其名称为action_replace,具有替换产品代码的逻辑。每当我单击“替换”按钮时,它总是首先在表nk_product_模板中插入记录,没有为插入编写代码,据我所知,它是自动的,并返回该记录的id,我使用该id从按钮操作中的表中检索原始代码和替换代码值,并在代码替换逻辑中使用这些值 我想知道这是解决用例的正确方法吗?如果这不是一种正确的方法,您将如何解决它。我的主要问题是,我是否需要为每个弹出窗口设置和获取字段值的新类、新模型和新表?非常感谢您的评论 以下是定义弹出窗口的XML代码:Python 使用弹出窗口获取用户输入,并在OpenERP中的按钮功能中使用这些输入,python,openerp,odoo,Python,Openerp,Odoo,我想请社区在OpenERP中评估我的解决方案。我用的是奥多v8 我创建了一个带有两个字段的弹出窗口,原始代码和替换代码,以及带有标题替换的按钮。弹出窗口从父页面“更多按钮”下拉选项启动 用例是用户将在“原始代码”字段中键入产品代码,该字段看起来像编辑文本框,而“替换代码”字段将自动填充并为只读。按下“替换”按钮将触发按钮操作,以替换数据库中相关表中的代码 我在数据库中创建了新模型、新类和新表nk_product_template,它继承自product_template。我创建新表的原因是让我的
<record id="replace_all_in_BOM_form" model="ir.ui.view">
<field name="name">replace.all.in.BOM.form</field>
<field name="model">nk.product.template</field>
<field name="priority" eval="20"/>
<field name="type">form</field>
<field name="arch" type="xml">
<group>
<field name="original_code" string="Original Code" style="width:
10%%" readonly="0" />
<field name="replacement_code" string="Replacement Code"
style="width: 10%%" readonly="1" invisible="0" />
<field name="default_code" string="Replacement" readonly="1"
invisible="1" />
<field name="uom_id" invisible="1" />
<field name="uom_po_id" invisible="1" />
<field name="type" invisible="1" />
<field name="categ_id" invisible="1" />
<field name="name" invisible="1" />
</group>
<button type="object" string="Replace" name="action_replace" />
</field>
</record>
我的py代码如下:
class nk_product_template(osv.osv):
_inherit = 'product.template'
_name = 'nk.product.template'
_columns = {
'replacement_code' : fields.char('Replacement Code', select=True),
'original_code' : fields.char('Original Code', select=True),
}
def default_get(self, cr, uid, fields, context=None):
# <code to automatically populate replacement_code field>
# ...
def action_replace(self, cr, uid, ids, context=None):
# <code that replaces product code>
# ...
不需要从product.template继承。只需创建一个引用要更改的模板的one2many字段 另外,看起来nk.product.template应该是一个瞬态模型,而不是一个普通模型。瞬态模型的对象仅暂时存在,不会无限期地存储在数据库中。它们适用于帮助器函数和向导,就像您的帮助器函数和向导一样 要使用瞬态模型,不要从osv.osv继承类,只需从osv.osv_内存继承它即可。或者更好的方法是,使用models.Model替代osv.osv和osv.osv_内存,而不是使用不推荐使用的osv 我最不想改变的是,您使用的是旧的ORMAPI。它太冗长,很难阅读,并且在某个时候会从新的Odoo版本中删除。使用新的Odoo ORM会更好 新型号可能看起来像这样显然我不知道具体细节,所以这只是一个例子:
from openerp import models, fields, api
class ProductCodeWizard(models.TransientModel):
_name = 'nk.code_wizard'
template = fields.Many2one(
'product.template',
required=True,
default=lambda self: self.env.context['active_id'],
)
replacement_code = fields.Char(string="Replacement Code")
original_code = fields.Char(
string="Original Code",
related='template.default_code',
readonly=True,
)
@api.one
def action_replace(self):
self.template.default_code = self.replacement_code
您可以阅读有关新ORMAPI和的更多信息。您还可以观看演示文稿和。对于此类问题,我建议使用另一个stackexchange网站:谢谢您的回答,Ludwik!我是奥多的新手。你能不能提供一个代码例子,让one2many领域你提到,因为它不是100%清楚我怎么做。另外,你能用一个代码示例来指导我如何使用新的ODOORM吗?再次感谢你。