【问题标题】:Odoo 8 domain filter on Many2one fieldMany2one 字段上的 Odoo 8 域过滤器
【发布时间】:2015-08-18 09:30:32
【问题描述】:

我想对 Odoo 8 中的 Many2one 字段进行过滤。 这是针对库存模块的。

我创建了额外的字段,用户可以在其中输入其他信息。现在我们要过滤出现在下拉列表中的可用字段,或者在单击“更多”按钮时仅显示该产品的附加字段。

这是 stock.production.lot 模型的代码 当 product_id 更新时,应该更改域过滤器。

class StockProductionLot(models.Model):
    _inherit = "stock.production.lot"
    lot_lot_additional_fields = fields.One2many("lot.lot.additional.fields", "stock_production_lot")

    @api.onchange("product_id")
    def onchange_product_id(self):
        res = {}
        cat_fields = self.product_id.categ_id.lot_fields_category.lot_additional_fields
        ids = []
        for item in cat_fields:
            ids.append(item.id)
        if self.product_id:
            res["domain"] = {"lot_additional_fields": [("id", "in", "ids")]}
        return res

这是将附加字段模型连接到批号模型的模型。 lot_additional_fields 应在此处更新。

class LotLotAdditionalFields(models.Model):
    _name = "lot.lot.additional.fields"
    value = fields.Char("Value")
    stock_production_lot = fields.Many2one("stock.production.lot", string="Lot/Serial Number")
    lot_additional_fields = fields.Many2one("lot.additional.fields", string="Additional field")

如果有人可以帮助我解决这个问题,我将非常感激。

========================编辑======================= ======

我已将代码添加到 stock.production.lot

class StockProductionLot(models.Model):
    _inherit = "stock.production.lot"
    lot_lot_additional_fields = fields.One2many("lot.lot.additional.fields", "stock_production_lot")
    lot_additional_fields = fields.Many2one("lot.additional.fields", string="Lot additional fields")
    remarks = fields.Html("General remarks")

    @api.onchange('product_id')
    def onchange_product_id(self):
        res = {}
        if self.product_id:
            ids = self.product_id.categ_id.lot_fields_category.lot_additional_fields.mapped('id')
            res['domain'] = {'lot_lot_additional_fields': [('lot_additional_fields', 'in', ids)]}
        return res

到 lot.additional.fields 我添加了 product_id:

class LotAdditionalFields(models.Model):
    _name = "lot.additional.fields"
    name = fields.Char("Name", required=True)
    type = fields.Selection(
        [("int", "Numerical"), ("string", "Alfanumerical"), ("boolean", "Checkbox"), ("date", "Date")], required=True)
    mandatory = fields.Boolean("Mandatory field")
    display_order = fields.Integer("Display Order")
    lot_field_category = fields.Many2many("lot.field.category", string="Field Category", required=True)
    lot_lot_additional_fields = fields.One2many("lot.lot.additional.fields", "lot_additional_fields")
    product_id = fields.Many2one("product.product", string="Product ID")

lot_lot_additional_fields 我保持不变:

class LotLotAdditionalFields(models.Model):
    _name = "lot.lot.additional.fields"
    value = fields.Char("Value")
    stock_production_lot = fields.Many2one("stock.production.lot", string="Lot/Serial Number")
    lot_additional_fields = fields.Many2one("lot.additional.fields", string="Additional field")

我还会添加xml代码:

 <record id="view_production_lot_form" model="ir.ui.view">
            <field name="name">Stock Production Lot Form</field>
            <field name="model">stock.production.lot</field>
            <field name="inherit_id" ref="stock.view_production_lot_form"/>
            <field name="arch" type="xml">
                <page string="Products" position="after">
                    <page string="Additional Fields">
                        <field name="lot_lot_additional_fields" >
                            <tree editable="bottom">
                                <field name="lot_additional_fields"  />
                                <field name="value"/>
                            </tree>
                        </field>
                        <h3>General remarks</h3>
                        <field name="remarks"/>
                    </page>
                </page>
            </field>
    </record>

【问题讨论】:

    标签: python python-2.7 odoo-8 odoo many-to-one


    【解决方案1】:

    您必须考虑到,在res["domain"] = {"lot_additional_fields": [("id", "in", "ids")]} 行中,您正在更改模型stock.production.lot 的域,顺便说一句,它似乎没有任何名为lot_additional_fields 的字段(它有一个字段改名为lot_lot_additional_fields)。

    @api.onchange('product_id')
    def onchange_product_id(self):
        res = {}
        if self.product_id:
            ids = self.product_id.categ_id.lot_fields_category.lot_additional_fields.mapped('id')
            res['domain'] = {'lot_lot_additional_fields': [('lot_additional_fields', 'in', ids)]}
        return res
    

    我正在阅读您的代码,现在我确定我在这里编写的代码是您想要在尝试中获得的正确代码。但是,我没有关于视图和课程lot.additional.fields 的任何信息,只有关于stock.production.lotlot.lot.additional.fields,我猜(如果我理解你想要什么)这行不通(修改视图中的域不会修改其他不同视图的域),除非您在 lot.additional.fields 类中有一个指向 product_idMany2one 字段(我在这里看不到)。

    编辑

    好的,如果我错了,请先纠正我:在您的 stock_production_lot 表单视图中,您会看到字段树 lot_lot_additional_fields。在这里,如果您打开字段lot_additional_fields 的下拉列表,您只希望能够选择当前stock_production_lotcateg_idproduct_id 的那些lot_fields_category 属于同一lot_fields_category 的那些lot_additional_fields ,不是吗?

    在这种情况下,试试这个代码:

    Python(把这个 onchange 放在你的 lot.lot.additional.fields 类中)

    @api.onchange('stock_production_lot')
    def onchange_stock_production_lot(self):
        res = {}
        if stock_production_lot:
            ids = self.stock_production_lot.product_id.categ_id.lot_fields_category.lot_additional_fields.mapped('id')
            res['domain'] = {
                'lot_additional_fields': [('id', 'in', ids)]}
            }
        return res
    

    XML(修改你的view_production_lot_form代码并写这个)

    <record id="view_production_lot_form" model="ir.ui.view">
        <field name="name">Stock Production Lot Form</field>
        <field name="model">stock.production.lot</field>
        <field name="inherit_id" ref="stock.view_production_lot_form"/>
        <field name="arch" type="xml">
            <page string="Products" position="after">
                <page string="Additional Fields">
                    <field name="lot_lot_additional_fields" widget="one2many_list" context="{'default_stock_production_lot': active_id}">
                        <tree editable="bottom">
                            <field name="stock_production_lot" invisible="1"/>
                            <field name="lot_additional_fields"/>
                            <field name="value"/>
                        </tree>
                    </field>
                    <h3>General remarks</h3>
                    <field name="remarks"/>
                </page>
            </page>
        </field>
    </record>
    

    【讨论】:

    • 您好 Torvas,我已经尝试过您的解决方案,但它似乎不起作用。原因是我只能在装饰器中放一个字段名。
    • 好的,我已经更好地阅读了你的问题,我将编辑答案。
    • 非常感谢您的努力,forvas。但它似乎还没有准备好。我添加了一些额外的代码。我对 Odoo 编程还很陌生,所以有很多东西要学。
    • 这就像一个魅力forvas。我只能给你一个,否则我会给你10+。仅仅从这个问题我就可以学到很多东西。非常感谢。你能解释一下你在哪里得到“default_stock_production_lot”和“active_id”。
    • 我很高兴能帮助你@Johan。我已经学会了default_active_id 在代码中的搜索(我试图模仿我没有制作的模块的行为,但我找到了这些)。您可能知道,Odoo 8 的文档很差,OpenERP 7 和 6.1 的文档更差。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多