2011-05-14 21 views
5

Tengo dificultades para guardar un formset en la base de datos. Tengo 2 modelos, uno que tiene una ForeignKey a la otra (que he hecho algunas entradas para el modelo Balanta en la página de administración de Django):Django: Cómo guardar un formset basado en dos modelos

models.py

class Balanta(models.Model): 
    data=models.DateField() 

    class Meta: 
     ordering=['data'] 
     verbose_name_plural="Balante" 

    def __unicode__(self): 
     return unicode(self.data) 


class Conturi(models.Model): 
    cont=models.PositiveIntegerField() 
    cont_debit=models.DecimalField(default=0, max_digits=30, decimal_places=2) 
    cont_credit=models.DecimalField(default=0, max_digits=30, decimal_places=2) 
    balanta=models.ForeignKey(Balanta) 

    class Meta: 
     #ordering=['cont'] 
     verbose_name_plural="Conturi" 

    def __unicode__(self): 
     return unicode(self.cont) 

siguiente hice un forms.py :

from sitfin.models import Conturi, Balanta 
from django.forms import ModelForm 

class BalantaForm(ModelForm): 
    class Meta: 
     model=Balanta 

class ConturiForm(ModelForm): 
    class Meta: 
     model=Conturi 

y la views.py:

from django.http import HttpResponseRedirect 
from django.shortcuts import get_object_or_404, render_to_response 
from django.template import RequestContext 
from sitfin.models import Balanta, Conturi 
from sitfin.forms import BalantaForm, ConturiForm 
from django.forms.formsets import formset_factory 

def conturi_index(request): 
    return render_to_response('sitfin/conturi_index.html',{'conturi_list':Conturi.objects.all()}) 

def conturi_introducere(request): 
    ConturiFormSet=formset_factory(ConturiForm) 
    if request.method=='POST': 
     #form=ConturiForm(data=request.POST) 
     conturi_formset=ConturiFormSet(request.POST, request.FILES) 
     #if form.is_valid(): 
     if conturi_formset.is_valid(): 
      for form in conturi_formset.cleaned_data: 
       balanta=Balanta(data=form['data']) 
       balanta.save() 
       cont=Conturi(cont=form['cont']) 
       cont.save() 
       return HttpResponseRedirect("sitfin/conturiok") 
    else: 
     #form=ConturiForm() 
     conturi_formset=ConturiFormSet() 
    #return render_to_response('sitfin/conturi_introducere.html',{'form':form}) 
    return render_to_response('sitfin/conturi_introducere.html',{'conturi_formset':conturi_formset}, context_instance=RequestContext(request)) 

y la plantilla:

<html> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=utf-8"> 

    <title>Conturi_introducere</title> 

</head> 
<body> 
    <p>BAGA CONTURILE</p> 
    <form action="" method="post">{% csrf_token %} 
     {{ conturi_formset.management_form }} 
     <table border="0"> 
      {% for cform in conturi_form %} 
      {{ cform }} 
      {% endfor %} 
     </table> 

    <p><input type="submit" value="Submit"></p> 
    </form> 
</body> 
</html> 

I lograr tener una forma que es un formset con los campos de modelo Conturi (con clave externa a modelo Balanta) y por debajo del campo en el modelo Balanta pero cuando presiono enviar obtengo KeyError 'datos'. Este es el error en este paso, pero recibo errores que logré superar, como balanta_id no puede ser nulo, o algo sobre alterar el management_form.

Quiero guardar el formset Conturi en función de la fecha que elijo del menú desplegable (la fecha se rellena previamente pero también pude ingresarla a mano) y más adelante en el desarrollo intentaré agregar un jquery para agregar más campos Conturi en el formulario y luego para guardar todo el formset en la base de datos, pero está muy lejos de mi problema.

¡Muchas gracias!

Respuesta

3

Mira esto: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets Esto realmente simplifica el caso de uso de llaves foráneas relacionadas, que debe adaptarse perfectamente a ti.

No debe iterar sobre los datos limpios como lo hace, un sencillo formulario.save() debería hacerlo. Además, me parece extraño que itere sobre el formulario en lugar del formset en la plantilla. Estoy súper somnoliento, así que no sé. Y su código no devuelve una respuesta cuando el formset no es válido. Obtendrás un error de 500 por eso.

Básicamente debe usar un formulario para el modelo Balanta y un formset en línea para el otro. A continuación, puede llevar a cabo la validación en dos partes: if formset is valid ... y if form is valid. ..

+0

Gracias! Entonces, ¿debería hacer la validación en 2 ifs separados? – Kaigara

+0

¡Lo hice hombre, rock! Puedo guardar los datos de ambos formularios/conjuntos de formularios en la base de datos en función de su respuesta.^- ^ – Kaigara

Cuestiones relacionadas