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

时间:2015-01-30 13:39:00

标签: python openerp odoo

我想请社群评估我在OpenERP中的解决方案。我正在使用Odoo v8。

我创建了一个弹出窗口,其中包含两个字段original_code和replacement_code,以及带有标题“Replace”的按钮。弹出窗口从父页面“更多”按钮下拉选项启动。

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

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

我的按钮动作功能在类nk_product_template中定义,其名称为action_replace(),其中包含替换产品代码的逻辑。每当我点击“替换”按钮时,它总是首先在表nk_product_template中插入记录(没有编写代码用于插入,它是我自动理解的)并返回该记录的id,我用它从表中检索original_code和replacement_code值在按钮的action_replace()中,并在代码替换逻辑中使用这些值。

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

以下是定义弹出窗口的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>
        # ...

1 个答案:

答案 0 :(得分:1)

无需继承product.template。只需创建一个引用您想要更改的模板的one2many字段。

此外,似乎nk.product.template应该是TransientModel而不是正常模型。瞬态模型的对象仅暂时存在,并且不会无限期地存储在数据库中。它们用于帮助函数和向导 - 就像你拥有的那样。

要使用瞬态模型,而不是从osv.osv继承您的类,只需从osv.osv_memory继承它。或者甚至更好,而不是使用已弃用的osv,对正常模型使用models.Model,对瞬态模型使用models.TransientModel(代替osv.osvosv.osv_memory

我要改变的最后一件事是您使用旧的ORM API。它太冗长,难以阅读,并且会在某些时候从新的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

您可以详细了解新的ORM API herehere。您还可以观看演示文稿herehere