Cómo guardar formularios de padre, hijo y nieto en una sola presentación de Django.
Estoy construyendo una aplicación para una empresa de trading móvil, esta es la situación: cada factura tiene un número de factura
único y cada fecha
única tienen varios modelos de teléfono
y cada modelo de teléfono tiene un número de IMEI
. Aquí es cómo he diseñado el modelo de base de datos.
class Collection(models.Model):
admin = models.ForeignKey(User,on_delete=models.PROTECT)
company = models.ForeignKey(Company,on_delete=models.PROTECT)
invoice_no = models.IntegerField(unique=True)
collection_date = models.DateTimeField(default=timezone.now)
class MobileCollection(models.Model):
collection = models.ForeignKey(Collection,on_delete=models.PROTECT,related_name='collections')
mobile = models.ForeignKey(ModelCategory,on_delete=models.PROTECT,related_name='model_category')
qnt = models.IntegerField()
price = models.DecimalField(decimal_places=3,max_digits=20)
class Imei(models.Model):
mobile = models.ForeignKey(MobileCollection,on_delete=models.PROTECT)
imei = models.CharField(max_length=15,unique=True)
Tengo que enviarlos todos de una sola vez! No estoy seguro de cómo construir su vista, mientras que el modelo de MobileCollection
debería aumentar dinámicamente y con el campo qnt
en MobileCollection
los formularios de Imei
deberían aumentar, por ejemplo, si el qnt=10
deberíamos agregar 10 formularios de Imei
, pensé en inlineformset_factory
pero no funciona en mi caso. ¿Hay un enfoque mejor para lograr eso? Gracias de antemano.
davy.ai
Solución:
Una forma de lograr esto es usar JavaScript y jQuery para agregar dinámicamente más formularios para los modelos
MobileCollection
yImei
.Aquí están los pasos para implementar esta solución:
Collection
,MobileCollection
eImei
.Agregar un evento de clic JavaScript en el botón “Agregar móvil” del formulario.
Dentro del evento de clic, clonar el elemento de formulario
MobileCollection
existente e incrementar los atributosname
yid
de los campos del formulario.Agregar otro evento de clic en el campo de entrada
Imei
que agregará dinámicamente más formulariosImei
según la cantidad (qnt
) ingresada por el usuario.Dentro del evento de clic del campo de entrada
Imei
, recorrer la cantidad ingresada y clonar el elemento de formularioImei
existente e incrementar el atributoname
del campo del formulario y luego agregarlo al formulario deMobileCollection
.Finalmente, enviar el formulario a la vista de Django usando jQuery Ajax.
Este enfoque asegura flexibilidad ya que el usuario puede agregar tantas
MobileCollections
como desee y también les permite agregar múltiples formulariosImei
porMobileCollection
.