¿Estás trabajando en algún proyecto con Django y te topas con el problema que no puedes permitir agregar duplicados?
La respuesta a la pregunta anterior, es poniendo como unique el o los campos que no deseas que se repitan (dupliquen), pero cuando intentas agregar un registro que ya existe o editar uno con un valor que ya existe, tomando en cuenta el unique, te sale algo así.
Bueno, lo que debes hacer es validar desde el formulario.
Para el siguiente ejemplo, estoy manejando un modelo de categoría a como sigue a continuación.
Como verás, la descripción está puesta como valor único, por tanto, la base de datos no permitirá que se agreguen dos registros con el mismo valor.
La validación, a como dije anteriormente, se hace en el formulario, se debe sobreescribir el método clean, y la lógica es la siguiente:
- Dentro de un try catch, tratar de filtrar el registro por medio del valor que viene del formulario contra los datos en la base de datos.
- Si el registro no existe, se disparará un except Categoria.DoesNotExist si se dispara, pondremos el comando pass, para que no haga nada, porque está correcto, el registro no existe
- Si la instancia que viene del formulario (self.instance.pk) no trae pk, indica que el registro es nuevo, pero si el filtro encontró coincidencia, se levanta un error de validación, en mi caso, le puse el mensaje Registro ya existe.
- Si la instancia ya trae pk, indica que el registro se está editando, pero si esta pk no coincide con lo que trae el envío del formulario, indica que se está tratando de cambiar la descripción del registro con un valor ya existente en la base de datos.
Ya luego te tocaría capturar el mensaje en tu plantilla y listo.
Espero que este muy pequeño tutorial te sea de utilidad.
Si deseas ver el curso completo, te dejo enlace (en cada imágen) de dos cursos que he publicado en Udemy, para que tengas más facilidad, he puesto descuento (en ambos cursos) de 95% del valor original, únicamente con el enlace en cada imagen, para que quede a USD 9.99 o el precio menor para tu país. Descuento máximo permitido por la plataforma.
Al hacer click en las imágenes te llevará al curso con cupón integrado del 95%
Para evitar replicar para cada caso simplemente se puede crear un clase que valide los fields del modelo definido en Meta y simplemente valide las existencias para los fields unique y los unique together, para los demás formularios sería una herencia y listo.
ResponderBorrar