【问题标题】:domain filter for many2one fields in odoo?odoo中many2one字段的域过滤器?
【发布时间】:2015-06-29 09:51:15
【问题描述】:

下面的代码是资产继承类。在这里,我将添加 'place' 字段与 'Karn/Bang/Kengeri' 和 'karn/bang/malleshwaram' 为 'Karn/Bang /Kengeri' 将在 A 和 B 中添加 'asset_catg_id'。然后在 Y 和 Z 中添加 'karn/bang/malleshwaram'。

现在在calander继承的类。如果我选择 'place' 和 'Karn/Bang/Kengeri' 那么下一个字段 'asset_catg_id' 我只需要获得 A和 B 下拉列表。如果再次 'karn/bang/malleshwaram' 那么我只需要获得 Y,Z 选项。并且之前选择的 'asset_catg_id' 值应该被删除。我尝试使用域过滤器选项得到 keyvalue 错误

class asset_asset(osv.osv):
    _inherit = "asset.asset"
    #_name = "asset_asset"
    _rec_name= "folio_num"
    _columns = {
        'name': fields.char('Asset Name', size=64),
        'place': fields.many2one('asset.parentlocation', 'Location'),
        'asset_catg_id' : fields.many2one('asset.catg', 'Asset Catg Selection', select=True, required=True),}

class asset_catg(osv.Model): 
    _name="asset.catg" 
    _rec_name='name1'
    _description="Define Asset Catgs" 
    _columns={ 'name1':fields.char('Asset Catg Names',size=64,required=True),}
asset_catg()
class asset_parentlocation(osv.osv):
    _name="asset.parentlocation"
    _rec_name="location_name"
    _columns = {
        'location_name' : fields.char('Asset Location', required=True),
        'parent_location' : fields.many2one('asset.parentlocation','Parent Location'),
        'nameee':fields.many2one('ir.attachment','Attachments'),}

    def name_get(self, cr, uid, ids, context=None):
        if context is None:
            context = {}
        if not ids:
            return []
        reads = self.read(cr, uid, ids, ['location_name','parent_location'], context=context)
        res = []
        for record in reads:
            name = record['location_name']
            if record['parent_location']:
                name = record['parent_location'][1]+' / '+name
            res.append((record['id'], name))
        return res



**Following code is calendar inherited class** 


class calendar_event(osv.osv):

    _inherit = "calendar.event"
    _rec_name = 'number'

    _columns = {
            'number' : fields.char('Meeting ID',readonly=1),
            #'place' : fields.many2one('stock.location','Substation Location',),

            'place' : fields.many2one('asset.parentlocation','Substation Location',),
            #'location' : fields.selection(STATUS_SELECTION,'Location',  default='Board A'),
            'asset_catg_id' : fields.many2one('asset.catg','Asset Catg Selection', domain="[('asset_catg_id', '=',place)]"),}

【问题讨论】:

    标签: python odoo


    【解决方案1】:

    首先,您的域在原则上是错误的。域是字段“内部”的内容,换句话说,在其模型中(例如asset.catg 模型中的字段name 或id)。所以你应该先解决这个问题。

    如果域依赖于另一个域,可以使用 onchange 方法返回域(使用占位符place_id)。像这样:

    @api.onchange('place')
    def onchange_place(self):
        res = {}
        if self.place:
            res['domain'] = {'asset_catg_id': [('place_id', '=', self.place.id)]}
        return res
    

    P.S. 这是新 v8 api 的示例,但同样的原则适用于旧 api(然后您不需要使用装饰器,还可以在方法上添加 cr, uid, ids 并通过您的视图调用它.所有这些都不需要新的api)。看起来您仍在使用旧 api 进行开发。

    更新 对于旧的 api:

    def onchange_place(self,cr, uid, ids, place, context=None):
        res = {}
        if self.place: #on old api it will return id, instead of record
            res['domain'] = {'asset_catg_id': [('place_id', '=', self.place)]}
        return res
    

    然后在你的视图中(不知道你用的是什么视图):

    <field name="place" on_change="onchange_place(place)"/>
    

    您仍然需要在asset.catg 中定义一些字段,以便用于匹配place 字段。例如:

    'place_id': fields.many2one('asset.parentlocation', 'Place')
    

    然后当你定义资产类别时,你设置它应该属于哪个地方。那么当你选择地点calendar.event时,onchange方法会正确设置asset_catg_id字段上的域。

    【讨论】:

    • 我是 odoo 新手,如果您不介意,请用我的代码更改重播我
    • 我已经给你写了一个解决方案。你至少应该给出你做了什么,什么没做。你也需要付出一些努力。
    • 正如你所说,我在代码上做了同样的事情,但它给出了内部服务器错误。我不知道为什么。我不明白为什么?
    • 所以你应该提供一个错误和你所做的所有步骤。如果你不能告诉我你想做什么,我就帮不了你。
    • @Andrius 你的代码 sn-p 帮了我很多,thanx buddy,但是发生了一件烦人的事情,那就是域过滤显示了以前的值。有关更多详细信息:-我有 2 个下拉列表,第二个取决于第一个,所以我想这样做,当我从第一个下拉列表中选择值时,第二个下拉列表应该填充 a/c 到第一个下拉列表的值。它有效,但第二个下拉列表显示基于 previuos 选择的值(在第一个下拉列表中选择)。提前感谢 :)
    猜你喜欢
    • 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
    相关资源
    最近更新 更多