Tengo mis 2 modelos
class Venta(models.Model): cliente = models.ForeignKey(Cliente,on_delete=models.CASCADE,verbose_name='Cliente') fecha = models.DateField(auto_now_add=True) descripcion = models.CharField(max_length=300, blank=True, verbose_name='Detalle del pedido') total = models.DecimalField(decimal_places=2, max_digits=7, verbose_name='Total de la venta') def __str__(self): return '{}'.format(self.id) class DetalleVenta(models.Model): producto = models.ForeignKey(Producto,on_delete=models.CASCADE,verbose_name='Producto') cantidad = models.IntegerField(verbose_name='Cantidad') venta = models.ForeignKey(Venta,on_delete=models.CASCADE, verbose_name='Venta') def __str__(self): return '{} - {}'.format(self.venta,self.producto)
EL cual me parece que es correcto porque una venta puede tener muchos detalles pero al momento de registrar una venta:
class VentaCreate(CreateView): model = DetalleVenta template_name = 'venta/venta_form.html' form_class = DetalleForm second_form_class = VentaForm success_url = reverse_lazy('venta:ventas_listar')
Tengo que declarar a “DetalleVenta” Porque? porque la llave foranea la tiene detalle y así puedo acceder a su venta a la que pertenece de esta manera:
def post(self, request, *args, **kwargs): self.object = self.get_object form = self.form_class(request.POST) form2 = self.second_form_class(request.POST) if form.is_valid() and form2.is_valid(): detalleventa = form.save(commit=False)
Justo aquí
detalleventa.venta = form2.save() detalleventa.save() return HttpResponseRedirect(self.get_success_url()) else: return self.render_to_response(self.get_context_data(form=form,form2=form2))
Y si funciona pero al querer hacer un update? voy a tener que acceder al id de detalle:
class VentaUpdate(UpdateView): model = DetalleVenta second_model = Venta template_name = 'venta/venta_form.html' form_class = DetalleForm second_form_class = VentaForm success_url = reverse_lazy('venta:ventas_listar') def get_context_data(self, **kwargs): context = super(VentaUpdate, self).get_context_data(**kwargs) pk = self.kwargs.get('pk', 0) detalle = self.model.objects.get(id=pk) venta = self.second_model.objects.get(id=detalle.venta_id) if 'form' not in context: context['form'] = self.form_class() if 'form2' not in context: context['form2'] = self.second_form_class(instance=venta) context['id'] = pk return context def post(self, request, *args, **kwargs): self.object = self.get_object id_detale = kwargs['pk'] detalle = self.model.objects.get(id=id_detale) venta = self.second_model.objects.get(id=detalle.venta_id) form = self.form_class(request.POST, instance=detalle) form2 = self.second_form_class(request.POST, instance=venta) if form.is_valid() and form2.is_valid(): form.save() form2.save() return HttpResponseRedirect(self.get_success_url()) else: return HttpResponseRedirect(self.get_success_url())
Entonces va coger el id del detalle, pero si son muchos estaría mal que quiera editar una venta con el id del detalle… Tendría que ser con el id de la venta ya que el detalle podría tener 1 o muchos detalles y accediendo al id de ese detalle estaría mal. Mi pregunta es si se puede acceder desde venta a su detalle(venta.detalle)? ya que la llave foránea(foreign key) de venta esta en el detalle pero el modelo venta no tiene como acceder a detalle.