2015-08-18 4 views
1

Я хотел бы сделать фильтр на поле Many2one в Odoo 8. Это для модуля запаса.Фильтр домена 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 

Это модель для подключения модели дополнительных полей к модели номера партии. Здесь необходимо обновить лот_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> 

ответ

3

Вы должны принять во внимание, что в строке 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.lot и lot.lot.additional.fields, и я думаю (если бы я хорошо понял, что вы хотите), что это не сработает (изменение домена в представлении не собираетесь изменять домен другого другого вида), если у вас нет поля Many2one, указывающего на product_id в классе lot.additional.fields (которого я не вижу здесь).

EDIT

Хорошо, первый поправьте меня, если я ошибаюсь: в вашем stock_production_lot зрения формы, вы видите дерево поля lot_lot_additional_fields. Здесь, если вы откроете раскрывающееся поле поля lot_additional_fields, вы можете только хотеть, чтобы иметь возможность выбирать те lot_additional_fields, которые принадлежат к тому же lot_fields_categorycateg_idproduct_id текущего stock_production_lot, не так ли?

В этом случае попробуйте этот код:

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> 
+0

Привет Торвас, я пробовал ваше решение, но оно не кажется работать. Причина в том, что я могу только указать имя поля в декораторе. –

+0

Хорошо, я лучше прочитал ваш вопрос, я отредактирую ответ. – forvas

+0

Большое спасибо за ваши усилия, заставки. Но, похоже, он еще не готов. Я добавил дополнительный код. Я до сих пор довольно новичок в программировании в Odoo, поэтому есть чему поучиться. –

Смежные вопросы