Saltar al contenido

Crear un dominio dinámico

🐍 DESARROLLO · ODOO · DOMINIOS

Cómo crear un dominio dinámico en Odoo

Los dominios dinámicos permiten restringir las opciones disponibles en un campo relacional según el contexto. Hacen la interfaz más intuitiva, evitan selecciones incorrectas y mantienen la integridad de los datos. En este tutorial: caso práctico de términos de pago permitidos por cliente.

🎯
FILTRA POR CONTEXTO
Solo opciones válidas según el registro

🛡️
INTEGRIDAD
Evita capturas inconsistentes

M2M COMPUTADO
Almacenado para usar en domain

👁️
UX MEJORADA
Menos errores del usuario

1
La problemática

Odoo permite seleccionar un término de pago por defecto para cada cliente. Al crear una venta y elegir al cliente, el término se selecciona automáticamente — pero el usuario puede cambiarlo a cualquier otro.

⚠️ EL PROBLEMA
En la práctica esto causa desalineación con políticas comerciales: a un cliente que solo tiene términos de “30 días” y “60 días” autorizados, alguien puede asignarle “120 días” por error o por costumbre.
✅ LA SOLUCIÓN
Definir términos de pago permitidos por cliente y restringir el campo de la venta para que solo permita seleccionar uno de esos términos autorizados. Cada cliente tiene su propio conjunto de opciones válidas.

2
Many2many de términos permitidos en el cliente

Primero definimos un campo Many2many dentro del modelo res.partner con relación al modelo account.payment.term:

Definición del campo Many2many de términos permitidos en res.partner

Y agregamos el campo en la vista formulario del cliente:

Vista XML del cliente con el nuevo campo
Cliente con tres términos de pago permitidos asignados

3
Many2many computado en la venta

Para que la venta pueda usar esa lista en el dominio del campo de término de pago, creamos un Many2many computado y almacenado que copia los valores del cliente seleccionado:

Campo Many2many computado almacenado en sale.order
💡 ¿POR QUÉ ALMACENADO?
Marcamos el campo como store=True para que persista en la BD. Esto permite usarlo en dominios estáticos en XML — sin almacenar, el cliente web no podría resolverlo en el momento de renderizar el filtro.

4
Mostrar el campo en la vista (temporalmente)

Agregamos el campo en la vista formulario de la venta. Por ahora lo dejamos visible para confirmar que funciona — más adelante lo ocultaremos:

Vista de la venta con el campo de términos permitidos visible

5
Aplicar el dominio dinámico al campo de la venta

Modificamos el atributo domain del campo payment_term_id en la vista para que solo muestre los términos permitidos del cliente seleccionado:

Vista XML con el dominio dinámico aplicado al campo payment_term_id

El resultado: ahora solo aparecen los 3 términos de pago configurados en el cliente, no toda la lista global:

Selector de término de pago filtrado a las 3 opciones del cliente

6
Ocultar el campo auxiliar

Confirmado el funcionamiento, ocultamos el campo Many2many auxiliar en la vista (lo necesitamos para el dominio pero no para que el usuario lo vea):

Cambio en la vista para ocultar el campo auxiliar
Vista final con solo el campo de término de pago restringido

🎯 Beneficios del dominio dinámico

✅ UX más intuitiva
El usuario solo ve opciones válidas para su contexto — menos confusión, menos backtracking.

✅ Integridad de datos
Imposible seleccionar valores inválidos según las reglas de negocio.

✅ Reglas alineadas con el negocio
Los términos comerciales acordados con el cliente quedan reflejados en la operación.

✅ Sin código Python complejo
Una vez creado el campo computado, el dominio en la vista hace el resto.

📌 En resumen

Los dominios dinámicos en campos Many2one son una técnica poderosa que mejora la experiencia del usuario al filtrar opciones relevantes según el contexto. La técnica del Many2many computado almacenado es elegante: copia la lista permitida desde el modelo padre y permite usarla como filtro en la vista.

No solo mejoran la usabilidad — también contribuyen a la integridad de los datos al evitar selecciones inconsistentes. En Exdoo aplicamos este patrón en módulos donde las reglas de negocio requieren validaciones contextuales (precios autorizados, almacenes permitidos, listas de productos por cliente). Si tienes dudas, escríbenos a info@exdoo.mx.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

¿Te gustaría implementar Odoo en tu empresa?

12 años de experiencia · +60 implementaciones exitosas · Partner Gold de Odoo en México

Hablemos por WhatsApp