Ir al contenido

Cómo Cambiar Dinámicamente Etiquetas/Cadenas Usando fieldsviewget

Cómo Cambiar Dinámicamente Etiquetas/Cadenas Usando fieldsviewget

Cuando trabajamos con Odoo, una vez que definimos una vista en XML, no tenemos muchas opciones para cambiarla dinámicamente basándonos en otros campos. Imagina que queremos modificar la etiqueta o cadena de un campo dependiendo de otro. Por desgracia, no podemos hacer esto de manera dinámica en la definición XML, pero hay una manera de hacerlo utilizando el método fields_view_get.

Este proceso se realiza sobrescribiendo la función fields_view_get de la clase del modelo. Lo interesante es que la clase del modelo se invoca cada vez que se renderiza un modelo en Odoo.

Consideremos un escenario donde queremos actualizar la cadena o etiqueta de un campo de forma dinámica. Te voy a mostrar cómo lograr esto sin necesidad de modificar el código XML. Para cambiar la cadena o etiqueta dinámicamente de un campo o un registro, tenemos que sobrescribir el método fields_view_get correspondiente de ese modelo.

En nuestro ejemplo, nuestro modelo se llamará SalePackageBundle, y contiene detalles sobre diferentes paquetes que corresponden a una orden de venta.

vista-formulario-basico-paquete-cybrosys

Fuente: https://www.cybrosys.com/blog/how-to-dynamically-change-label-string

La imagen anterior muestra la vista de formulario básica del paquete. Supongamos que queremos cambiar la cadena de referencia de venta a un texto personalizado. Puede parecer raro, pero con un método similar podemos cambiar dinámicamente la cadena o etiqueta de un campo. Para hacer esto, primero debemos llamar a fields_view_get dentro de nuestra clase de modelo.

def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):

El método fields_view_get acepta varios parámetros:

  • self: Detalles del registro actual o un valor None.
  • view_id: El id de la vista correspondiente (árbol, formulario, kanban, etc.).
  • view_type: El tipo de vista con la que estamos trabajando.
  • toolbar y submenu: Pueden especificarse si es necesario, pero su presencia es necesaria, así que los configuramos en False.
result = super(SalePackageBundle, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)

A continuación, llamamos al método existente fields_view_get del modelo y modificamos su resultado. Aquí llamamos al método super de fields_view_get del SalePackageBundle con los parámetros como fueron pasados. Ahora consideremos nuestro escenario en el que queremos cambiar la cadena del campo existente, que es la referencia de venta.

Dado que nuestro modelo actualmente tiene solo una vista de formulario y una vista de árbol, podemos verificar directamente si view_type es igual a 'form' o 'tree'. Podría haber casos en los que el modelo con el que estemos trabajando contenga más de una vista de formulario u otras. En ese caso, podríamos usar la condición con view_id, ya que cada vista tiene su view_id único.

Ya que estamos cambiando la cadena de un campo dentro de nuestra vista de formulario, usaremos la condición:

if view_type == 'form':

A continuación, obtenemos el XML correspondiente a la vista de formulario. Para eso, añade la siguiente importación y carga el XML en una variable.

from lxml import etree
doc = etree.XML(result['arch'])

El XML de la vista de formulario se carga en la variable doc. Luego, obtenemos el campo correspondiente cuyo valor de cadena queremos cambiar.

sale_reference = doc.xpath("//field[@name='sale_order_name']")

Aquí, 'saleordername' es el nombre del campo para la referencia de venta.

Para cambiar el valor de la cadena del campo, utilizamos el método set.

sale_reference[0].set("string", "Orden de Venta")

Recuerda que debes llamar al campo con [0], ya que el valor del campo es parte de una lista. Dentro del método set, pasamos el atributo que estamos configurando, en este caso es la cadena, y el siguiente atributo toma su valor, es decir, "Orden de Venta".

Luego, empaquetamos las modificaciones que hemos realizado y las cargamos de nuevo en nuestro resultado.

result['arch'] = etree.tostring(doc, encoding='unicode')
return result

Como resultado, la cadena se cambia de "Referencia de Venta" a "Orden de Venta" en nuestra vista de formulario. Recuerda que el método fields_view_get se llama solo durante la renderización inicial, así que deberás recargar la vista para visualizar los cambios que hemos realizado.

vista-modificada-cambio-cadena-cybrosys

Fuente: https://www.cybrosys.com/blog/how-to-dynamically-change-label-string

Al recargar, se puede comprobar que la cadena ha cambiado a "Orden de Venta".

De manera similar, si queremos añadir una etiqueta al campo, podemos hacerlo utilizando el método addnext.

sale_reference[0].addnext(etree.Element('label', {'string': 'Número de Referencia de Venta'}))

El valor de la clave string se mostrará como una etiqueta debajo del campo.

etiqueta-agregada-cybrosys

Fuente: https://www.cybrosys.com/blog/how-to-dynamically-change-label-string

Aquí tienes el código completo:

def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
    result = super(SalePackageBundle, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
    if view_type == 'form':
        doc = etree.XML(result['arch'])
        sale_reference = doc.xpath("//field[@name='sale_order_name']")
        if sale_reference:
            sale_reference[0].set("string", "Orden de Venta")
            sale_reference[0].addnext(etree.Element('label', {'string': 'Número de Referencia de Venta'}))
            result['arch'] = etree.tostring(doc, encoding='unicode')
    return result

Este ejemplo puede no parecer muy significativo, pero usando un método similar, podemos cambiar dinámicamente la etiqueta o la cadena de los campos según diferentes condiciones y tipos de vistas.

Servicios Relacionados

Si necesitas implementar dinámicamente cambios en las vistas de Odoo en tu empresa, puedo ayudarte con eso. Desde consultoría e implementación hasta el desarrollo de módulos personalizados, estoy aquí para asegurar que tu sistema funcione de la manera que necesitas.

Contacta conmigo para una consulta gratuita o Agenda una demo personalizada para explorar cómo Odoo puede adaptarse a tu negocio. ¡Estamos aquí para ayudarte a optimizar tus procesos!

Cómo Cambiar Dinámicamente Etiquetas/Cadenas Usando fieldsviewget
Jorge Blanco 18 de febrero de 2026
Compartir esta publicación
Etiquetas
Nuestros blogs
Archivar
El Mejor Software de Punto de Venta (POS)