Как я могу показать данные нескольких полей в поле Many2one в Odoo 14?

#python #web #frameworks #odoo

#питон #паутина #фреймворки #odoo

Вопрос:

Они необходимы для веб-сайта в форме регистрации (2 требования):

Я добавил поле zone_id в модель res.users и форму регистрации (веб-сайт), в котором будет выбрана зона. Я хочу показать другое значение поля zone_status (поле выбора) с именем зоны, как показано ниже:

 Zone1 - Active

Zone2 - Active

Zone3 - InActive
 

и т.д.

Как это можно сделать? А также мне нужно руководство, чтобы показать множество строк Поля2one для выбора из списка, как обычно, в собственном пользовательском интерфейсе Odoo. Он отображается автоматически, но не на странице / форме веб-сайта. В настоящее время у меня есть это как текст, как изменить его, чтобы он вел себя / отображался как поле Many2one:

 <div class="form-group field-zone_id">
   <label for="zone_id">Your Zone</label>
   <input type="text" name="zone_id" id="zone_id" class="form-control form-control-sm"/>
</div>
 

Ответ №1:

Для вашего первого вопроса вы можете перезаписать метод name_get в модели, с которой у вас есть отношение m2o, и настроить строку конкатенации по своему усмотрению. Смотрите приведенный ниже пример

 def name_get(self):
    return [(record.id, record.name) for record in self]
 

Ссылка на пример модуля флота

 @api.depends('name', 'brand_id')
def name_get(self):
    res = []
    for record in self:
        name = record.name
        if record.brand_id.name:
            name = record.brand_id.name   '/'   name
        res.append((record.id, name))
    return res
 

или создайте новое вычисляемое поле с вашей строкой. Смотрите приведенный ниже пример из ссылки на категорию продуктов odoo

 class ProductCategory(models.Model):
    _name = "product.category"
    #...
    _rec_name = 'complete_name'
    _order = 'complete_name'

    name = fields.Char('Name', index=True, required=True)
    complete_name = fields.Char(
        'Complete Name', compute='_compute_complete_name',
        store=True)

    #...

    @api.depends('name', 'parent_id.complete_name')
    def _compute_complete_name(self):
        for category in self:
            if category.parent_id:
                category.complete_name = '%s / %s' % (category.parent_id.complete_name, category.name)
            else:
                category.complete_name = category.
 

Для второго вопроса вы можете прочитать данные следующим образом. Смотрите приведенный ниже пример формы ссылка на модуль website_sale

 <div t-attf-class="form-group #{error.get('country_id') and 'o_has_error' or ''} col-lg-6 div_country">
    <label class="col-form-label" for="country_id">Country</label>
    <select id="country_id" name="country_id" t-attf-class="form-control #{error.get('country_id') and 'is-invalid' or ''}">
        <option value="">Country...</option>
        <t t-foreach="countries" t-as="c">
            <option t-att-value="c.id" t-att-selected="c.id == (country and country.id or -1)">
                <t t-esc="c.name" />
            </option>
        </t>
    </select>
</div>
 

Комментарии:

1. спасибо @Amr Ad-Alkrim за подробное руководство, я развернул ваш последний код здесь, чтобы заполнить поле many2one в форме веб-сайта, чтобы сделать выбор. при обновлении приложения нет ошибки, но при запуске формы регистрации отображается ошибка: Ошибка при рендеринге компиляции AST AttributeError: объект ‘NoneType’ не имеет атрибута ‘get’ Шаблон: auth_signup.fields Путь: /t/ div[6]

2. мне не удалось получить информацию (например: что использовала модель, t-foreach=countries» , что такое c.id == (страна и country.id или -1) и т. Д.) Используется здесь из-за моих очень небольших знаний, для обоих вопросов здесь мой файл model / python: класс ResUsersExt(модели. Модель): _inherit = ‘res.users’ contact_no = поля. Char(строка = ‘Номер контакта’) адрес = поля. Текст (строка=’Ваш адрес’, обязательно= True, по умолчанию=’00’) zone_id = поля. Many2one(‘tests.zones’, string=»Ваша зона», обязательно = True, по умолчанию =»1″)