【问题标题】:OpenERP-v7: Add custom field to delivery order from sale orderOpenERP-v7:从销售订单向交货订单添加自定义字段
【发布时间】:2015-08-14 20:37:55
【问题描述】:

我在我的 sale_order 表单中添加了一个自定义字段,现在我希望它显示在确认销售订单后生成的相应交货订单上。在 v8 中可能有一种更简单的方法可以做到这一点,但我必须在 v7 中做到这一点,所以请只回复适用于 OpenERP v7 的答案。

在尝试了许多其他方法来完成此操作后,我在 odoo.com 上找到了一个建议,有人说您应该尝试覆盖“_prepare_order_picking”函数,因为它实际上是根据销售订单中的值创建交货单的,通过返回要在交货单上显示的值的字典。我已经获取了该链接提供的代码,但它不适用于我。这是link。非常感谢任何帮助,我已尝试将所有内容都弄清楚,但如果我需要澄清任何事情,请告诉我,我将编辑我的问题。

我已经修改了我的代码,使其更易于阅读,并将我需要从销售订单中获取的自定义字段的数量限制为一个字段,当这实际工作时我需要多个字段,但应该很容易正确实施后进行扩展。

我修改后的代码如下:

__openerp__.py:

{
"name"        : "Nick's Sale order/delivery order form fields",
"version"     : "1.0",
"author"      : "Nick",
"category"    : "Custom",
"depends"     : ['sale', 'stock'],
"description" : """ Sale and delivery order customizations by Nick """,
'data'        : ['nicks_sale_fields.xml', 'nicks_delivery_fields.xml'],
'installable' : True,
}

nicks_sale_fields.py:

from openerp.osv import fields,osv
class nicks_sale_fields(osv.Model):
    _inherit='sale.order'
    def _prepare_order_picking(self, cr, uid, order, context=None):
        vals=super(sale_order, self)._prepare_order_picking(cr, uid, order, context=context)
        vals.update({'my_custom_field': 'my_custom_field_value'})
        return vals

    _columns={
        'my_custom_field': fields.char('field description', required=True, store=True, size=3, help='field help text',),
    }
    _defaults={
        'my_custom_field': 'yes'
    }

nicks_sale_fields.xml:

<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
    <record model="ir.ui.view" id="nicks_sale_order_fields">
        <field name="name">sale.order.form</field>
        <field name="model">sale.order</field>
        <field name="inherit_id" ref="sale.view_order_form"/>
        <field name="arch" type="xml">
            <xpath expr="/form/sheet/notebook/page[1]/group" position="after">
                <group string="Sales order: custom fields">
                    <field name="my_custom_field" string="Sale form descriptor" class="oe_inline"/>
                </group>
            </xpath>
        </field>
</record>
</data>
</openerp>

nicks_delivery_fields.xml:

<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
    <record model="ir.ui.view" id="nicks_deliv_order_fields">
        <field name="name">stock.picking.out.form</field>
        <field name="model">sale.order</field>
        <field name="inherit_id" ref="stock.view_picking_out_form"/>
        <field name="arch" type="xml">
            <xpath expr="/form/sheet/group/group[2]/field[@name='origin']" position="after">
                <group string="Delivery order: custom fields">
                    <field name="my_custom_field" string="Delivery form descriptor" class="oe_inline"/>
                </group>
            </xpath>
        </field>
    </record>
</data>
</openerp>

【问题讨论】:

  • 注意:您不需要store=True,因为它不是函数字段。

标签: python openerp odoo openerp-7


【解决方案1】:

您需要在__openerp__.py 文件中添加sale_stock(取决于销售和库存)模块的依赖关系。喜欢

"depends"     : ['sale_stock'],

nicks_delivery_fields.xml 中,您提供了错误的型号名称来修改交货单视图。应该是stock.picking

<?xml version="1.0" encoding="utf-8"?>
<openerp>
  <data>
      <record model="ir.ui.view" id="nicks_deliv_order_fields">
          <field name="name">stock.picking.out.form</field>
          <field name="model">stock.picking</field>
          <field name="inherit_id" ref="stock.view_picking_out_form"/>
          <field name="arch" type="xml">
              <xpath expr="/form/sheet/group/group[2]/field[@name='origin']" position="after">
                  <group string="Delivery order: custom fields">
                      <field name="my_custom_field" string="Delivery form descriptor" class="oe_inline"/>
                  </group>
              </xpath>
          </field>
      </record>
  </data>
</openerp>

【讨论】:

  • 谢谢,我可以说我很接近了,但是表单中没有显示字段,我已经对 xml 进行了更改,所以现在模型是 stock.picking,并且在“nicks_delivery_fields”类中,我继承了 stock.picking。我想我一定是在某种程度上错误地自定义了视图,因为在我进行这些更改之前(以及在你的帮助之前的其他一些更改)我的字段已经出现了,尽管他们没有做我想要的。
  • 我不明白的是,在我的 xml 代码中,我的交货单字段与我的销售订单字段并没有真正不同,并且销售订单字段显示得很好.我可以看到的唯一区别是,当我在查看销售订单时在开发人员模式下单击“管理视图”时,我正在自定义的视图对象与我在自定义类中继承的对象相同(sale.order ),在交货单管理视图菜单中,我正在自定义的视图对象是“stock.picking.out”,但我在自定义类中继承了“stock.picking”。
  • 我在某处读到我可能需要为 stock.picking.out 创建第二个类并复制我要创建的字段,所以现在我有两个类具有相同的 _columns 条目,一个一个继承 stock.picking.out 和一个继承 stock.picking。然后,在 xml 中,如果我将模型设置为 stock.picking,字段仍然不显示,如果我将模型设置为 stock.picking.out,我会收到一个无效的 xml 错误,它在跟踪中说:“无法为模型呈现视图 nicks_sale_fields.nicks_deliv_order_fields:stock.picking.out”希望这可以帮助您诊断我的问题。
【解决方案2】:

假设您只想让自定义销售订单字段可在交货时读取,您可以使用 related 计算字段:

class StockPicking(osv.Model):
    _inherit='stock.picking'
    _columns={
        'my_custom_field': fields.related(
            'sale_id', 'my_custom_field', type='char',
            readonly=True, string='field description'),
    }

【讨论】:

  • 谢谢,请参阅我对 Atul 回答后续问题的评论
  • 尼克,这个对你有帮助吗?
【解决方案3】:

感谢大家的帮助,我能够解决我的问题,@daniel-reis 正确地说明了如何使用相关字段,效果很好。使我的模块依赖于 __openerp__.py 文件中的“sale_stock”也有帮助,因此感谢@atul-arvind。在这并没有完全奏效之后,我不得不进一步挖掘,发现由于 stock.picking.out 模型继承自 stock.picking 的方式(在 v7 中,我认为这在 v8 中已修复),因此有必要创建两个自定义类,一个从 stock.picking 继承,一个从 stock.picking.out 继承。然后在这些类中的每一个中,定义您的自定义字段,然后它们会显示出来并且继承将正常工作,如下所示:

class stock_picking_out(osv.Model):
    _name = 'stock.picking.out'
    _inherit = 'stock.picking.out'
    _columns = { 'my_custom_field': fields.related(
        'sale_id', 'my_custom_field', type='char',
        readonly=True, string='field description'),
    }
class stock_picking(osv.Model):
    _name = 'stock.picking'
    _inherit = 'stock.picking'
    _columns = { 'my_custom_field': fields.related(
        'sale_id', 'my_custom_field', type='char',
        readonly=True, string='field description'),
    }

然后,在我的 xml 文件中,我将模型行更改为:

<field name="model">stock.picking.out</field>

一切从这里开始,我的销售订单中的自定义字段存储在数据库表 sale_order 中,并正确显示在交货订单字段中。

如有任何关于本文的问题,请随时与我联系,我会尽力解答。

【讨论】:

    猜你喜欢
    • 2022-12-20
    • 2011-06-08
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多