2017-01-09 12 views
1

Так что я пытаюсь заполнить список One2many по умолчанию. Я определил базовое поле, прочитал «специальные команды» для One2many и Many2many, но по какой-то причине он не работает (сообщение об ошибке или вообще ничего не заполняет)По умолчанию fill One2many

Мой код:

@api.one 
def _get_competitions(self): 
    result = [] 
    values = {'name': 'test', 'xx_price': 550, 'xx_seats_left': 50, 'xx_attending': True} 
    result.append((0, 0, values)) 
    return result 

xx_competitions_attendee = fields.One2many('xx.competition.attendee', 'xx_event_id', string="Competitions", default=_get_competitions) 

Переработан это немного, и теперь я просто возвращается результат поиска и до сих пор в списке не заполняются:

@api.model 
def _get_competitions(self): 
    return self.env['xx.competition.attendee'].search([('xx_event_id.id', '=', self._context.get('active_ids')[0])]) 

xx_competitions_attendee = fields.One2many('xx.competition.attendee', 'xx_event_id', string="Competitions", default=_get_competitions) 

Я уже установить связь Many2one в другой модели , Я не думал, что очень важно, чтобы я опубликовал его здесь, но, конечно:

class CompetitionAttendee(models.Model): 
    _name = 'xx.competition.attendee' 

    xx_event_id = fields.Many2one('event.event', string="Event") 
+0

Будете ли вы использовать отношение для этого one2many или вам нужно показать его только в форме? – dccdany

ответ

0

Примечание:

@api.model 
    def _get_competitions(self): 
     result = [] 
     values = {'name': 'test', 'xx_price': 550, 'xx_seats_left': 50, 'xx_attending': True} 
     result.append((0, 0, values)) 
     return result 

В вышеописанном случае, вы получите значение в One2many списка, потому что вы передаете значение поля "xx_competitions_attendee"

@api.model 
def _get_competitions(self): 
    return self.env['xx.competition.attendee'].search([('xx_event_id.id', '=', self._context.get('active_ids')[0])]) 

метод по умолчанию будет вызывать когда вы собираетесь создавать запись, поэтому в контексте нет никаких активных_средств, поэтому словарь вернет None.

Таким образом, вы можете иметь ошибки: TypeError: объект 'NoneType' не имеет атрибута 'GetItem'

Примечание:

You just need to set many2one reference while you feel one2many record. Because One2many field is managed by framework it self and it's always being generated against the many2one reference and you have not specify any Many2one reference there.

values = {'many2one_field' : many2one_ref, 'name': 'test', 'xx_price': 550, 'xx_seats_left': 50, 'xx_attending': True,} 

Вы должны попробовать следующее,

@api.model 
def _get_competitions(self): 
    result = [] 
    values = {'name': 'test', 'xx_price': 550, 'xx_seats_left': 50, 'xx_attending': True} 
    result.append((0, 0, values)) 
    return result 

You have decorated method with wrong decorator, to set default values method must be decorated with @api.model (blank recordset) while @api.one always require recordset to call method.

Вы можете обратиться к Odoo Docs, чтобы узнать больше о декораторах методов.

+0

Я полностью забыл о декораторе. Теперь я сделал запись в своей модели (из списка One2many). В моем методе по умолчанию я просто возвращаю результат поиска (отлаживает его и содержит записи). Так что в основном то же, что я упоминал в OP, но список просто не заполняется. Я добавлю пример кода в OP – RandomPerson

+0

Если возможно, пожалуйста, обновите вопрос с помощью структуры модели. –

+0

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