Python 使用弹出窗口获取用户输入,并在OpenERP中的按钮功能中使用这些输入

Python 使用弹出窗口获取用户输入,并在OpenERP中的按钮功能中使用这些输入,python,openerp,odoo,Python,Openerp,Odoo,我想请社区在OpenERP中评估我的解决方案。我用的是奥多v8 我创建了一个带有两个字段的弹出窗口,原始代码和替换代码,以及带有标题替换的按钮。弹出窗口从父页面“更多按钮”下拉选项启动 用例是用户将在“原始代码”字段中键入产品代码,该字段看起来像编辑文本框,而“替换代码”字段将自动填充并为只读。按下“替换”按钮将触发按钮操作,以替换数据库中相关表中的代码 我在数据库中创建了新模型、新类和新表nk_product_template,它继承自product_template。我创建新表的原因是让我的

我想请社区在OpenERP中评估我的解决方案。我用的是奥多v8

我创建了一个带有两个字段的弹出窗口,原始代码和替换代码,以及带有标题替换的按钮。弹出窗口从父页面“更多按钮”下拉选项启动

用例是用户将在“原始代码”字段中键入产品代码,该字段看起来像编辑文本框,而“替换代码”字段将自动填充并为只读。按下“替换”按钮将触发按钮操作,以替换数据库中相关表中的代码

我在数据库中创建了新模型、新类和新表nk_product_template,它继承自product_template。我创建新表的原因是让我的按钮操作将记录插入此表中,而不是产品模板表中。我在表中添加了两个新的字符字段,即原始_代码和替换代码。该模型在弹出窗口的XML代码中引用

My button action函数在nk_product_模板类中定义,其名称为action_replace,具有替换产品代码的逻辑。每当我单击“替换”按钮时,它总是首先在表nk_product_模板中插入记录,没有为插入编写代码,据我所知,它是自动的,并返回该记录的id,我使用该id从按钮操作中的表中检索原始代码和替换代码值,并在代码替换逻辑中使用这些值

我想知道这是解决用例的正确方法吗?如果这不是一种正确的方法,您将如何解决它。我的主要问题是,我是否需要为每个弹出窗口设置和获取字段值的新类、新模型和新表?非常感谢您的评论

以下是定义弹出窗口的XML代码:

<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吗?再次感谢你。