Vistas y la Interfaz de Usuario en Odoo
Las vistas XML se guardan en ir.ui.view. En Odoo 20 las listas se declaran con <list> y las tarjetas Kanban usan la plantilla card. Formularios, listas, calendarios, gráficos y pivotes son modos de visualización; la búsqueda es una configuración complementaria.
1. Vistas, búsqueda, acción y menú #
Este archivo utiliza los campos y el botón definidos en la lección de ORM:
Fichero views/biblioteca.xml:
1<odoo> 2 <record id="view_library_book_form" model="ir.ui.view"> 3 <field name="name">library.book.form</field> 4 <field name="model">library.book</field> 5 <field name="arch" type="xml"> 6 <form string="Book"> 7 <header> 8 <button name="action_make_available" string="Make available" type="object"/> 9 <field name="state" widget="statusbar"/> 10 </header> 11 <sheet> 12 <group> 13 <field name="name"/><field name="author"/><field name="isbn"/> 14 <field name="pages"/><field name="publication_date"/> 15 <field name="company_id"/><field name="currency_id" invisible="True"/> 16 <field name="price"/><field name="discounted_price"/> 17 <field name="priority"/><field name="partner_id"/> 18 <field name="tag_ids" widget="many2many_tags"/> 19 </group> 20 <notebook><page string="Synopsis"><field name="description"/></page></notebook> 21 </sheet> 22 </form> 23 </field> 24 </record> 25 <record id="view_library_book_list" model="ir.ui.view"> 26 <field name="name">library.book.list</field> 27 <field name="model">library.book</field> 28 <field name="arch" type="xml"> 29 <list decoration-success="state == 'available'"> 30 <field name="name"/><field name="author"/><field name="price"/><field name="state"/> 31 </list> 32 </field> 33 </record> 34 <record id="view_library_book_search" model="ir.ui.view"> 35 <field name="name">library.book.search</field> 36 <field name="model">library.book</field> 37 <field name="arch" type="xml"> 38 <search><field name="name"/><field name="author"/></search> 39 </field> 40 </record> 41 <record id="action_library_book" model="ir.actions.act_window"> 42 <field name="name">Books</field> 43 <field name="res_model">library.book</field> 44 <field name="view_mode">list,form</field> 45 <field name="search_view_id" ref="view_library_book_search"/> 46 </record> 47 <menuitem id="menu_library_root" name="Library"/> 48 <menuitem id="menu_library_books" name="Books" parent="menu_library_root" action="action_library_book"/> 49</odoo>
search_view_id selecciona una vista de búsqueda; no añadas search a view_mode. Si omites search_view_id, Odoo elige la búsqueda predeterminada del modelo.
Los contenedores sheet, group, notebook y page organizan el formulario. decoration-success evalúa una expresión sobre campos presentes en la vista. Un botón type="object" llama a un método real del modelo.
2. Permisos iniciales e instalación #
Antes de instalar, crea estos permisos de desarrollo. En la lección de seguridad sustituiremos este archivo por roles propios y restricciones multiempresa:
Fichero security/ir.access.csv:
1id,name,model_id,group_id/id,operation,domain 2access_library_book_user,Read books,library.book,base.group_user,r, 3access_library_tag_user,Read tags,library.tag,base.group_user,r, 4access_library_loan_user,Manage loans,library.loan,base.group_user,cru, 5access_library_book_manager,Manage books,library.book,base.group_system,crud, 6access_library_tag_manager,Manage tags,library.tag,base.group_system,crud, 7access_library_loan_manager,Manage all loans,library.loan,base.group_system,crud,
Instala como se explica en Docker. El administrador puede crear libros; los demás usuarios internos pueden leerlos. No se conceden estos permisos a público ni portal.
3. Heredar una vista sin sustituirla #
La siguiente ampliación añade una etiqueta al campo ya existente; guárdala en views/book_inherit.xml y añádela al manifiesto después de views/biblioteca.xml:
Fichero views/book_inherit.xml:
1<odoo> 2 <record id="view_library_book_form_inherit" model="ir.ui.view"> 3 <field name="name">library.book.form.inherit</field> 4 <field name="model">library.book</field> 5 <field name="inherit_id" ref="view_library_book_form"/> 6 <field name="arch" type="xml"> 7 <xpath expr="//field[@name='isbn']" position="attributes"> 8 <attribute name="placeholder">ISBN-13</attribute> 9 </xpath> 10 </field> 11 </record> 12</odoo>
Usa position="after", before, inside, replace o attributes según la modificación. Para heredar un modelo de otro módulo, declara también su dependencia. Conserva las referencias anteriores al ampliar el manifiesto.