Я думаю, что нашел хороший подход для вас.
Исследование
Сначала я ищу оригинальный шаблон, который отображается с виджетом many2many_checkboxes
. Вот этот:
<t t-name="FieldMany2ManyCheckBoxes">
<div t-foreach="widget.get('records')" t-as="record">
<div class="o_checkbox">
<input t-if="widget.get('value').indexOf(record[0]) !== -1" type="checkbox" t-att-data-record-id="JSON.stringify(record[0])" checked="checked"/>
<input t-if="widget.get('value').indexOf(record[0]) === -1" type="checkbox" t-att-data-record-id="JSON.stringify(record[0])"/>
<span/>
</div>
<label class="o_form_label"><t t-esc="record[1]"/></label>
</div>
</t>
Template
Итак, я скопировал полученный HTML-код структуры group
и соединил его с шаблоном виджета.
Вам необходимо создать XML-файл с этим содержимым и добавить его в файл __manifes__.py
:
'qweb': ['static/src/xml/many2many_checkboxes.xml', ]
Код many2many_checkboxes.xml
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<t t-extend="FieldMany2ManyCheckBoxes">
<t t-jquery="div:first" t-operation="replace">
<div class="o_group">
<table class="o_group o_inner_group o_group_col_6">
<tbody>
<t t-foreach="widget.m2mValues" t-as="record">
<t t-if="record_parity == 'odd'">
<t t-set="id_for_label" t-value="'o_many2many_checkbox_' + _.uniqueId()"/>
<tr>
<td colspan="1" class="o_td_label">
<label t-att-for="id_for_label" class="o_form_label"><t t-esc="record[1]"/></label>
</td>
<td colspan="1" style="width: 50%;">
<div class="o_checkbox o_form_field_boolean o_form_field">
<div class="o_checkbox">
<input type="checkbox" t-att-id="id_for_label" t-att-data-record-id="JSON.stringify(record[0])"/>
<span/>
</div>
</div>
</td>
</tr>
</t>
</t>
</tbody>
</table>
<table class="o_group o_inner_group o_group_col_6 pull-right">
<tbody>
<t t-foreach="widget.m2mValues" t-as="record">
<t t-if="record_parity == 'even'">
<t t-set="id_for_label" t-value="'o_many2many_checkbox_' + _.uniqueId()"/>
<tr>
<td colspan="1" class="o_td_label">
<label t-att-for="id_for_label" class="o_form_label"><t t-esc="record[1]"/></label>
</td>
<td colspan="1" style="width: 50%;">
<div class="o_checkbox o_form_field_boolean o_form_field">
<div class="o_checkbox">
<input type="checkbox" t-att-id="id_for_label" t-att-data-record-id="JSON.stringify(record[0])"/>
<span/>
</div>
</div>
</td>
</tr>
</t>
</t>
</tbody>
</table>
</div>
</t>
</t>
</templates>
Форма
Наконец добавьте поле в форму. Но без элементов group
, так как мы уже добавляем элементы group
html в шаблон выше. Вам нужно добавить атрибут this style="display: block;"
, чтобы сохранить положение в сетке справа.
<separator string="Field name" />
<field name="test_many2many_checkboxes"
widget="many2many_checkboxes"
nolabel="1"
style="display: block;" />
Дайте мне знать, если это работает для вас. Я проверил с моим экземпляром Odoo 11, и он работает нормально. Это результат с двумя столбцами. Если вы хотите три столбца, вам нужно адаптировать шаблон:
Возможная альтернатива
Я проверил, как разработчики Odoo сделали таблицу в «Технических настройках». Они создают одну таблицу вместо двух, как я. Так что, возможно, есть лучший способ сделать это, потому что мне нужно дважды перебрать все записи, чтобы построить две таблицы.
В любом случае, вы можете улучшить мой код. Я только хотел привести вас к решению. Может быть, вы можете сгруппировать записи по три, чтобы построить строки.
Оду 10
Шаблон немного изменился для версии 10, поэтому вам нужно использовать этот шаблон:
<t t-extend="FieldMany2ManyCheckBoxes">
<t t-jquery="div:first" t-operation="replace">
<div class="o_group">
<table class="o_group o_inner_group o_group_col_6">
<tbody>
<t t-foreach="widget.get('records')" t-as="record">
<t t-if="record_parity == 'odd'">
<tr>
<td colspan="1" class="o_td_label">
<label for="o_field_input_28" class="o_form_label" data-original-title="" title="">
<span t-esc="record[1]"/>
</label>
</td>
<td colspan="1" style="width: 50%;">
<div class="o_checkbox o_form_field_boolean o_form_field">
<div class="o_checkbox">
<input t-if="widget.get('value').indexOf(record[0]) !== -1" type="checkbox" t-att-data-record-id="JSON.stringify(record[0])" checked="checked"/>
<input t-if="widget.get('value').indexOf(record[0]) === -1" type="checkbox" t-att-data-record-id="JSON.stringify(record[0])"/>
<span/>
</div>
</div>
</td>
</tr>
</t>
</t>
</tbody>
</table>
<table class="o_group o_inner_group o_group_col_6 pull-right">
<tbody>
<t t-foreach="widget.get('records')" t-as="record">
<t t-if="record_parity == 'even'">
<tr>
<td colspan="1" class="o_td_label">
<label for="o_field_input_28" class="o_form_label" data-original-title="" title="">
<span t-esc="record[1]"/>
</label>
</td>
<td colspan="1" style="width: 50%;">
<div class="o_checkbox o_form_field_boolean o_form_field">
<div class="o_checkbox">
<input t-if="widget.get('value').indexOf(record[0]) !== -1" type="checkbox" t-att-data-record-id="JSON.stringify(record[0])" checked="checked"/>
<input t-if="widget.get('value').indexOf(record[0]) === -1" type="checkbox" t-att-data-record-id="JSON.stringify(record[0])"/>
<span/>
</div>
</div>
</td>
</tr>
</t>
</t>
</tbody>
</table>
</div>
</t>
</t>