如何使用Django在一个视图中保存2个表单

时间:2016-08-05 08:44:14

标签: django django-forms django-views

我想用他的产品(型号Venta_detalle)创建一张票(型号Ventas)

我的模特是:

class Ventas(models.Model): 
    metodo_pago = models.CharField(max_length=80)
    fecha = models.DateTimeField(auto_now_add=True,auto_now=False)
    cajero = models.ForeignKey('auth.user')
    cliente = models.ForeignKey(Clientes,blank=True,null=True)
    total = models.DecimalField(max_digits=10,decimal_places=2)


class Venta_detalle(models.Model):
    venta = models.ForeignKey(Ventas)
    producto = models.ForeignKey(Productos)
    cantidad = models.IntegerField()

    def __unicode__(self):
        return self.producto.descripcion


class Productos(models.Model):
    codigo = models.CharField(max_length=80)
    descripcion = models.TextField()
    precio_compra = models.DecimalField(max_digits=10,decimal_places=2)
    precio_venta = models.DecimalField(max_digits=10,decimal_places=2)
    existencia = models.IntegerField()
    impuesto = models.ForeignKey(Impuestos,blank=True,null=True)
    imagen = models.ImageField(upload_to='productos')

    def __unicode__(self):
        return self.descripcion

我需要在同一模板中创建许多Venta_detalle对象,其中包含产品,数量和Ventas ID。

例如:当我们在管理面板中添加 ObjectInline(admin.TabularInline)以显示具有外键的两个模型时。

我的观点只有:

def VentasCrear(request):

    if request.method == "POST":        
        form = VentaForm(request.POST)
        if form.is_valid():
            venta = form.save(commit=False)
            venta.cajero = request.user
            venta.save()
    else:
        form = VentaForm()

    return render(request, 'ventas.html',  {'form': form})

2 个答案:

答案 0 :(得分:1)

" 如何使用Django在一个视图中保存2个表单?"

GET中,您使用前缀初始化表单:

venta_form = VentaForm(prefix='venta_form')    
venta_detalle_form = VentaDetalleForm(prefix='venta_detalle_form')
context = { 'venta_form' : venta_form, 'venta_detalle_form' : venta_detalle_form }
return render(request, 'ventas.html',  context)

然后在POST

venta_form = VentaForm(request.POST, prefix='venta_form')
venta_detalle_form = VentaDetalleForm(request.POST, prefix='venta_detalle_form')

然后你去。

答案 1 :(得分:1)

  

Enespañol: Veo que lo que quieres es guardar una sola Venta y en ella   Guardar muchos detalles de esa venta,como los son los poductos y eso。   Como lo tienes esta bien pero le falta una parte,en la vista seria de   esta forma

我也在学习Python& Django,但我认为您想要的是保存一个销售,并在其中保存该销售的许多细节,例如Productos。你走在正确的轨道上,但这里是如何修改视图。

def VentasCrear(请求):

if request.method == "POST": 
    # cuando llega el formulario los recibimos con sus respectivos prefijos (prefix) asi:
    #primero el formulario de Ventas       
    form = ventaform(request.POST, prefix="venta_form")
    #ahora recibimos el formulario de los detalles
    form2 = venta_detalle_form(reques.POST, prefix="venta_detalle_form")
    if form.is_valid() and form2.is_valid():  # si los formularios son validos
        venta = form.save(commit=False)
        venta.cajero = request.user
        venta.save() 
        # en este punto ya tienes la ventaguardada ahora procedes con los detalles    
        detalle = form2.save(commit=False)
        detalle.venta = venta # esta es la llave foranea de lo que guardamos arriba
        detalle.save()
else:   # este se cumpliria si es un GET
    formventa = ventaform(prefix="venta_form")
    formdetalle = venta_detalle_form(prefix="venta_detalle_form")
    context = { 'form' : formventa, 'form2' : formdetalle }

return render(request, 'ventas.html',  context)