This question has been flagged
4 Replies
4789 Views

Hello , 

I have a many2one fields , and i want to hide some record from its list .

What's the function that get all list of many2one field and add it to menu list ?

UPDATED

 What if i want to change domain for field in many2one object ?


example : 


class Class_A(osv.osv):
    _name = "class.a"
    _columns = {
        'name': fields.char('Name'),
     }

class Class_B(osv.osv):
    _name = "class.b"
    _columns = {
        'target_field': fields.many2one('class.a')
        'class_b_id': fields.many2one('class.c'),
     }

class Class_C(osv.osv):
    _name = "class.c"
    _columns = {
        'user_id': fields.many2one('res.partner'),
        'class_b_mto': fields.one2many('class.b','class_b_id'),
     }

 

Class C in user_id field have on_change function , Now if i want to change the domain of target_field in class B not the same class of user_id . What i have to do ??

 

Avatar
Discard
Best Answer

on_change can return 'domain' key which is a dictionary whose keys are the (m2o, m2m) name of the fields whose domain need to be changed and whose values are with their corresponding domain.

Avatar
Discard

Thank you for repeating my answer.

Author

Thanks , It works good , but i have another issue , Please See Updated Question.

Best Answer

Hello,

You can add a domain in the declaration of the field into the view to add a filter for the list...

 

Eg: 

<field name="partner_id" domain="[('name','=ilike','z%')]" />

It will only display a list of partner with name starting with "z"

 

JKE

Avatar
Discard
Author

Thanks , but i have another issue , Please See Updated Question.

Best Answer

 By convention, many2one fields end with '_id'

What you have to do, to filter out some records is to add a domain filter in your field (in xml file).

For example, in your .py file: 'yourfield_id': fields.many2one('your.model','Something'),

And in you xml: <field name="yourfield_id" domain="[('Something', '=', True)]"/>  (or any other valid condition)

 

Avatar
Discard
Author

Thanks , but i have another issue , Please See Updated Question.

Without a concrete example i can't figure out what you really want. But, what you should remember is, with a fields.many2one the relation is from the current model to another model where a record from the current model can be linked to the same record of the other model. My advice is, try to study the code from the sale module (sale.py and sale_view.xml files) to see how the many2one relation is build, how the on_change method and domain filter are used... waiting for more comments ...

Best Answer

If by dynamic you mean the list of selection can change if the value of another field changed, then you need to implement on_change mechanism on the triggering field.  on_change can return 'domain' key which is a dictionary whose keys are the (m2o, m2m) name of the fields whose domain need to be changed and whose values are with their corresponding domain.

Avatar
Discard
Author

Thanks , but i have another issue , Please See Updated Question.

Sameer, it would be best to post another question if you have another issue. Anyway, the answer to your question is still the same. Now, you need to answer this first: which field will trigger the domain change for target_field (which is obviously should be from Class B's form view and should be Class B's field). Then you implement on_change on that field.

Or do you actually want to domain / filter class_b_mto by it's target_field's value? Which is also possible.

Author

I try to trigger the domain of target_fields from class c , but not trigger , and the domain not changed to new domain . the problem that when i make some records of class c and apply the my default domain that will cause a problem , the problem is the domain will hide some record that not belong to domain . thanks for replay , any idea how to solve that problem ?

You cannot trigger domain of target_fields from class C. I'm not sure what you are trying to achieve here.