J'essaye de filtrer une colonne "item" qui a un type many2one basé sur les noms qui existent déjà dans une autre colonne "itemsnames" qui a un type char, je ne peux pas écrire le domaine dans le fichier xml, voici mon fichier xml:
class class2(models.Model): _name = 'module.item' name = fields.Char(string='item') class class3(models.Model): _name = 'module.categorieitem' name = fields.Many2one('module.categorie', string='Categorie') item = fields.Many2one('module.item', string='Item') class class4(models.Model): _inherit = 'sale.order.line' categorie = fields.Many2one('module.categorie') # list1=[1,2] # item = fields.Many2one('module.item', domain=[('id', '=', list1)]) item = fields.Many2one('module.item') itemsids = fields.Char() itemsnames = fields.Char() @api.onchange('categorie') def _onchange_categorie(self): print('»»» call onchange_categorie') res = {} items_ids = [] items_names = [] records = self.env['module.categorieitem'].search([('name','=',self.categorie .id)]) for record in records: print(record.item.name) items_ids.append(record.item.id) items_names.append(record.item.name) self.itemsids = items_ids self.itemsnames = items_names print('itemsnames: ',self.itemsnames) res['domain'] = {'item':[('id','in',items_ids)]} return res
Voici le fichier python:
<record id="sale_order_line_form_inherited" model="ir.ui.view"> <field name="name">sale_order.line.form.inherited</field> <field name="model">sale.order</field> <field name="inherit_id" ref="sale.view_order_form"/> <field name="arch" type="xml"> <xpath expr="//tree//field[@name='name']" position="after"> <field name="categorie"/> <!--<field name="item" domain="[('item.name','=', 'name.name')]"/>--> <!--<field name="item" domain="[('item.name','in',items)]"/>--> <field name="item" domain="[('item.name','in',itemsnames)]"/> <field name="itemsids"/> <field name="itemsnames"/> </xpath> </field> </record>
Voici une capture d'écran pour la vue
3 Réponses :
Cela me semble un problème de diffusion.
Vous déclarez itemsnames
comme char,
class class4(models.Model): ... item_id = fields.Many2one('module.item', domain="[('item_name','in',self.items_names_list)]") item_name = fields.Char(related="item_id.name", store=False)
et même si items_names
type est liste
domain="[('item.name','in',items_names_list)]
lorsque vous attribuez une liste
à un champ Char
, une conversion de type doit avoir lieu . Ainsi, self.itemsnames
obtient une représentation sous forme de chaîne de votre liste, pas une liste.
import simplejson as json ... class class4(models.Model): ... def _onchange_categorie(self): ... self.itemsnames = jsons.dumps(items_names) @property def items_names_list(self): return json.loads(self.itemsnames)
Ensuite, vous utilisez itemsnames
comme s'il avait un tableau alors qu'il n'en a pas
domain="[('item.name','in',itemsnames)]
Puis-je suggérer de stocker dans itemsnames
une représentation JSON de items_names? Ainsi, vous pourrez à nouveau obtenir une liste plus tard. Le code Python peut ressembler à quelque chose comme:
self.itemsnames = items_names
et changez le domaine en
items_names = [] ... items_names.append(record.item.name)
Champ non valide
exception: Il y a d'autres problèmes:
_id
car sinon, Odoo ne générera pas la table pour stocker la relation dans la base de données. item
(maintenant item_id
) est un champ mais item.name
ne l'est pas. Vous devez utiliser un champ connexe pour avoir ces informations dans ce modèle (voir https://www.odoo.com/documentation/12.0/reference/orm.html#related-fields ) items_names_list
a été défini comme une propriété de classe donc, dans votre classe, il doit être appelé comme self.items_names_list
Alors, essayez quelque chose comme:
class class4(models.Model): ... itemsnames = fields.Char()
merci, mais j'obtiens cette erreur: augmenter ValueError ("Champ non valide% r dans la feuille% r"% (gauche, str (feuille)))
Puis-je suggérer d'utiliser _logger.info
ou _logger.debug
au lieu de print
?
classe SalesController (http.Controller):
@http.route('/rounds/details', type='http', auth="public", website=True) def pos_details_json(self): rounds = http.request.env['sale.order.line'].search([]) my_list = [] for data in rounds: my_list.append({'Line Name': data.item.name}) return json.dumps(my_list)