Contenido
En Odoo, tanto UserError
como ValidationError
se utilizan para mostrar mensajes de error al usuario, pero se usan en contextos diferentes y tienen comportamientos ligeramente distintos. Aquí te detallo cuándo usar cada uno:
UserError
¿Cuándo usarlo?
- Errores de uso o restricciones de negocio: Cuando quieras informar al usuario sobre un error relacionado con el flujo de trabajo o una restricción de negocio que debe corregir antes de continuar.
- Errores comprensibles por el usuario final: Si el mensaje está destinado a ser leído y entendido por el usuario final (por ejemplo, un mensaje como "No puedes confirmar esta orden porque el inventario es insuficiente").
-
Mensajes más flexibles:
UserError
es más flexible para mostrar mensajes personalizados y amigables para el usuario.
Ejemplo:
from odoo.exceptions import UserError
if some_condition_is_not_met:
raise UserError("No puedes realizar esta acción porque no cumples con el requisito X.")
¿Qué hace?
- Muestra un mensaje emergente con el texto especificado.
- No interrumpe otros procesos o validaciones; simplemente informa al usuario y le permite corregir el error.
ValidationError
¿Cuándo usarlo?
-
Validación de datos en el ORM: Cuando quieras validar datos antes de que se guarden en la base de datos, especialmente en el método
create
owrite
. - Restringir cambios en registros: Si deseas detener la operación de guardado y no permitir que continúe hasta que el usuario corrija el error (por ejemplo, validar que un campo no esté vacío o que un valor esté dentro de un rango específico).
-
Validaciones críticas de modelo: Se utiliza principalmente en los métodos
@api.constrains
y@api.onchange
para asegurar la integridad de los datos.
Ejemplo:
from odoo.exceptions import ValidationError
from odoo import models, fields, api
class MyModel(models.Model):
_name = 'my.model'
amount = fields.Float(string="Monto")
@api.constrains('amount')
def _check_amount(self):
for record in self:
if record.amount < 0:
raise ValidationError("El monto no puede ser negativo.")
¿Qué hace?
-
Interrumpe el flujo de guardado: Si se lanza un
ValidationError
, la transacción se revierte y el registro no se guarda en la base de datos. - Muestra el mensaje de error en la vista de formulario y destaca el campo relacionado con el error (si aplica).
Resumen de Diferencias
Característica | UserError | ValidationError |
---|---|---|
Contexto de uso | Errores de uso, restricciones de negocio. | Validación de datos antes de guardar en la DB. |
Comportamiento | Muestra un mensaje emergente. | Interrumpe el guardado y revierte la transacción. |
Dónde usarlo | En métodos de acción o lógica de negocio. | En @api.constrains , @api.onchange , create , write . |
Visibilidad | Visible en un pop-up para el usuario final. | Visible en la vista de formulario y destaca el campo afectado. |
¿Cuándo elegir uno u otro?
- Usa `` cuando: Quieras mostrar un mensaje informativo o de advertencia sin detener por completo el flujo de trabajo.
- Usa `` cuando: Necesites asegurarte de que los datos sean válidos antes de guardarlos en la base de datos o quieras detener una operación hasta que se corrija el error.