Odoo Help

Welcome!

This community is for beginners and experts willing to share their Odoo knowledge. It's not a forum to discuss ideas, but a knowledge base of questions and their answers.

2

How to add radio button widget

By
faizan
on 8/24/13, 8:46 AM 10,032 views

as we cant add radio btn directly . in several post i saw it can be addd by widget so how and where i can add radio widget

2

Serpent Consulting Services Pvt. Ltd.

--Serpent Consulting Services Pvt. Ltd.--
4341
| 6 6 8
Gandhinagar, India
--Serpent Consulting Services Pvt. Ltd.--

Serpent Consulting Services Pvt. Ltd. Your Odoo/OpenERP Solution, just an email away!

Serpent Consulting Services Pvt. Ltd.
On 8/26/13, 4:06 AM

Hello Faizan,

There is no radio button widget available in v7.

You can get only drop down widget for both selection and many2one fields. However, in v8, there will be a new radio button widget that can be used in view using widget="radio" attribute.

The new radio widget is available now in trunk branch.

Thank you.

3
joseph d'souza
On 8/24/13, 2:45 PM

There is no radio button widget in v7, but you can add it using widget="radio" attribute.

First you create your own widget [like selection widget] then add python code and XML code like below:

Python Code :

 'syllabus': fields.selection([('one','One'),('two','Two')],'Syllabus'),

XML Code :

<field name="syllabus" widget="radio"/>

Hope It Helps You More !!!

Thanks !

I think you mean this is possible only in v8.0 which is not released yet.

Mohammad Alhashash
on 8/24/13, 5:31 PM
2
George
On 4/14/14, 9:56 AM

Create Sample module web_widget_radio

1) Required files

   __init__.py
   __openerp__.py
   static/src/js/widget_radio.js
   static/src/xml/widget_radio.xml

2) Add following in __openerp__.py

'js': ['static/src/js/widget_radio.js'],
'qweb': ['static/src/xml/widget_radio.xml'],

3) Add following code in static/src/xml/widget_radio.xml

<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<t t-name="FieldRadio">
    <span t-attf-class="oe_form_field oe_form_field_radio #{widget.options.horizontal ? 'oe_horizontal' : 'oe_vertical'}" t-att-style="widget.node.attrs.style">
        <span t-if="!widget.get('effective_readonly')">
            <t t-if="widget.options.horizontal">
                <t t-set="width" t-value="Math.floor(100 / widget.selection.length)"/>
                <t t-if="!widget.options.no_radiolabel">
                    <t t-foreach="widget.selection" t-as="selection">
                        <label t-att-for="widget.uniqueId + '_' + selection[0]" t-att-style="'width: ' + width + '%;'"><t t-esc="selection[1]"/></label>
                    </t>
                    <br/>
                </t>
                <t t-foreach="widget.selection" t-as="selection">
                    <div t-att-style="'width: ' + width + '%;'">
                        <span class="oe_radio_input"><input type="radio" t-att-name="widget.uniqueId" t-att-id="widget.uniqueId + '_' + selection[0]" t-att-value="selection[0]"/></span>
                    </div>
                </t>
            </t>
            <t t-if="!widget.options.horizontal">
             <html>
                <tr>
                   <t t-foreach="widget.selection" t-as="selection">
                        <span class="oe_radio_input"><input type="radio" t-att-id="widget.uniqueId + '_' + selection[0]" t-att-name="widget.uniqueId" t-att-value="selection[0]"/></span><label t-if="!widget.options.no_radiolabel" t-att-for="widget.uniqueId + '_' + selection[0]"><t t-esc="selection[1]"/></label>
                    </t>
                </tr>
             </html>

            </t>
        </span>
        <span t-if="widget.get('effective_readonly')" class="oe_radio_readonly"><t t-esc="widget.get('value')[1]"/></span>
    </span>
</t>
</templates>

4) Add following code in static/src/js/widget_radio.js

openerp.web_widget_radio = function (instance)
{
    instance.web.form.widgets.add('radio', 'instance.web_widget_radio.FieldRadio');
    instance.web_widget_radio.FieldRadio = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, {
        template: 'FieldRadio',
        events: {
            'click input': 'click_change_value'
        },
        init: function(field_manager, node) {
            /* Radio button widget: Attributes options:
            * - "horizontal" to display in column
            * - "no_radiolabel" don't display text values
            */
            this._super(field_manager, node);
            this.selection = _.clone(this.field.selection) || [];
            this.domain = false;
        },
        initialize_content: function () {
            this.uniqueId = _.uniqueId("radio");
            this.on("change:effective_readonly", this, this.render_value);
            this.field_manager.on("view_content_has_changed", this, this.get_selection);
            this.get_selection();
        },
        click_change_value: function (event) {
            var val = $(event.target).val();
            val = this.field.type == "selection" ? val : +val;
            if (val == this.get_value()) {
                this.set_value(false);
            } else {
                this.set_value(val);
            }
        },
        /** Get the selection and render it
         *  selection: [[identifier, value_to_display], ...]
         *  For selection fields: this is directly given by this.field.selection
         *  For many2one fields:  perform a search on the relation of the many2one field
         */
        get_selection: function() {
            var self = this;
            var selection = [];
            var def = $.Deferred();
            if (self.field.type == "many2one") {
                var domain = instance.web.pyeval.eval('domain', this.build_domain()) || [];
                if (! _.isEqual(self.domain, domain)) {
                    self.domain = domain;
                    var ds = new instance.web.DataSetStatic(self, self.field.relation, self.build_context());
                    ds.call('search', [self.domain])
                        .then(function (records) {
                            ds.name_get(records).then(function (records) {
                                selection = records;
                                def.resolve();
                            });
                        });
                } else {
                    selection = self.selection;
                    def.resolve();
                }
            }
            else if (self.field.type == "selection") {
                selection = self.field.selection || [];
                def.resolve();
            }
            return def.then(function () {
                if (! _.isEqual(selection, self.selection)) {
                    self.selection = _.clone(selection);
                    self.renderElement();
                    self.render_value();
                }
            });
        },
        set_value: function (value_) {
            if (value_) {
                if (this.field.type == "selection") {
                    value_ = _.find(this.field.selection, function (sel) { return sel[0] == value_;});
                }
                else if (!this.selection.length) {
                    this.selection = [value_];
                }
            }
            this._super(value_);
        },
        get_value: function () {
            var value = this.get('value');
            return value instanceof Array ? value[0] : value;
        },
        render_value: function () {
            var self = this;
            this.$el.toggleClass("oe_readonly", this.get('effective_readonly'));
            this.$("input:checked").prop("checked", false);
            if (this.get_value()) {
                this.$("input").filter(function () {return this.value == self.get_value();}).prop("checked", true);
                this.$(".oe_radio_readonly").text(this.get('value') ? this.get('value')[1] : "");
            }
        }
    });
};

5) Once files are created install the module.Once installation is complete you have done 80% of creating Radio button

6) Few more steps to get 100%

Create Selection field in your_python_file.py

IS_OBSTRUCTED = [ ('yes', 'YES'), ('no', 'NO'), ]

class your_module(osv.osv):
    _name = "your.module"  
    _description = "Your module Description"
    _columns = {
                'is_obstructed':fields.selection(IS_OBSTRUCTED,'Obstructed View?'),
    }
your_module()

Create filed view in XML

    <field name="is_obstructed" widget="radio"/>
0
faizan
On 8/26/13, 10:45 AM

i got it.. when i download the new version 8 from nightly.openerp.com/trunk/nightly/src/

and change the view file code to <field name="syllabus" widget="radio"/>

then radio btn appears..

thanks for your answers

Please, go to the first answer and set it as correct (click on grey circle that become green). Thanks.

Francesco OpenCode
on 8/28/13, 6:42 AM

How to assign a value for widget= radio using xml

Umashankar Subramani
on 5/25/15, 5:55 AM
0
George
On 4/14/14, 6:47 AM

It is possible follow this steps and achieve it.

  1. Create file structure given below Create flolder and name web_widget_radio __init__.py __openerp__.py static/src/js/widget_radio.js static/src/xml/widget_radio.xml

  2. Add these two lines in _openerp_.py 'js': ['static/src/js/widget_radio.js'], 'qweb': ['static/src/xml/widget_radio.xml'], Make _init_.py empty file

  3. Add following code in static/src/xml/widget_radio.xml <templates id="template" xml:space="preserve"> <t t-name="FieldRadio"> <t t-if="widget.options.horizontal"> <t t-set="width" t-value="Math.floor(100 / widget.selection.length)"/> <t t-if="!widget.options.no_radiolabel"> <t t-foreach="widget.selection" t-as="selection"> <label t-att-for="widget.uniqueId + '_' + selection[0]" t-att-style="'width: ' + width + '%;'"><t t-esc="selection[1]"/></label> </t>
    </t> <t t-foreach="widget.selection" t-as="selection">

    <input type="radio" t-att-name="widget.uniqueId" t-att-id="widget.uniqueId + '_' + selection[0]" t-att-value="selection[0]"/>
    </t> </t> <t t-if="!widget.options.horizontal"> <html> <t t-foreach="widget.selection" t-as="selection"> <input type="radio" t-att-id="widget.uniqueId + '_' + selection[0]" t-att-name="widget.uniqueId" t-att-value="selection[0]"/><label t-if="!widget.options.no_radiolabel" t-att-for="widget.uniqueId + '_' + selection[0]"><t t-esc="selection[1]"/></label> </t> </html>

            </t>
        </span>
        <span t-if="widget.get('effective_readonly')" class="oe_radio_readonly"><t t-esc="widget.get('value')[1]"/></span>
    </span>
    

    </t> </templates>

  4. Add following script in static/src/js/widget_radio.js openerp.web_widget_radio = function (instance) { instance.web.form.widgets.add('radio', 'instance.web_widget_radio.FieldRadio'); instance.web_widget_radio.FieldRadio = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, { template: 'FieldRadio', events: { 'click input': 'click_change_value' }, init: function(field_manager, node) { /* Radio button widget: Attributes options: * - "horizontal" to display in column * - "no_radiolabel" don't display text values / this._super(field_manager, node); this.selection = _.clone(this.field.selection) || []; this.domain = false; }, initialize_content: function () { this.uniqueId = _.uniqueId("radio"); this.on("change:effective_readonly", this, this.render_value); this.field_manager.on("view_content_has_changed", this, this.get_selection); this.get_selection(); }, click_change_value: function (event) { var val = $(event.target).val(); val = this.field.type == "selection" ? val : +val; if (val == this.get_value()) { this.set_value(false); } else { this.set_value(val); } }, /* Get the selection and render it * selection: [[identifier, value_to_display], ...] * For selection fields: this is directly given by this.field.selection * For many2one fields: perform a search on the relation of the many2one field */ get_selection: function() { var self = this; var selection = []; var def = $.Deferred(); if (self.field.type == "many2one") { var domain = instance.web.pyeval.eval('domain', this.build_domain()) || []; if (! _.isEqual(self.domain, domain)) { self.domain = domain; var ds = new instance.web.DataSetStatic(self, self.field.relation, self.build_context()); ds.call('search', [self.domain]) .then(function (records) { ds.name_get(records).then(function (records) { selection = records; def.resolve(); }); }); } else { selection = self.selection; def.resolve(); } } else if (self.field.type == "selection") { selection = self.field.selection || []; def.resolve(); } return def.then(function () { if (! _.isEqual(selection, self.selection)) { self.selection = _.clone(selection); self.renderElement(); self.render_value(); } }); }, set_value: function (value_) { if (value_) { if (this.field.type == "selection") { value_ = _.find(this.field.selection, function (sel) { return sel[0] == value_;}); } else if (!this.selection.length) { this.selection = [value_]; } } this._super(value_); }, get_value: function () { var value = this.get('value'); return value instanceof Array ? value[0] : value; }, render_value: function () { var self = this; this.$el.toggleClass("oe_readonly", this.get('effective_readonly')); this.$("input:checked").prop("checked", false); if (this.get_value()) { this.$("input").filter(function () {return this.value == self.get_value();}).prop("checked", true); this.$(".oe_radio_readonly").text(this.get('value') ? this.get('value')[1] : ""); } } }); }; Finally save all files and restart server and install this module once get installed

    1. How to use it in your view Create module and open your ______________.py file Create selection field IS_OBSTRUCTED = [ ('yes', 'YES'), ('no', 'NO'), ]

Finally OpenERP 7.0 allows you to create radio button

Your Answer

Please try to give a substantial answer. If you wanted to comment on the question or answer, just use the commenting tool. Please remember that you can always revise your answers - no need to answer the same question twice. Also, please don't forget to vote - it really helps to select the best questions and answers!

About This Community

This community is for professionals and enthusiasts of our products and services. Read Guidelines

Question tools

2 follower(s)

Stats

Asked: 8/24/13, 8:46 AM
Seen: 10032 times
Last updated: 5/18/15, 9:26 AM