2011-05-14 22 views
5

पर आधारित एक प्रारूप को कैसे सहेजना है मुझे डेटाबेस में एक फॉर्मेट सहेजने में मुश्किल हो रही है। मैं 2 मॉडल, एक दूसरे के लिए एक ForeignKey होने (मैं Django व्यवस्थापक पृष्ठ बलांता मॉडल के लिए कुछ प्रविष्टियों बनाया) है:Django: दो मॉडल

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) 

अगले मैं एक 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 

और 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)) 

और टेम्पलेट:

<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> 

मैं एक रूप है जो Conturi मॉडल में क्षेत्रों के साथ एक formset (बलांता मॉडल के लिए विदेशी कुंजी के साथ) है के लिए प्रबंधन और बलांता मॉडल, लेकिन जब में फ़ील्ड के नीचे मैं सबमिट दबाता हूं मुझे KeyError 'डेटा' मिलता है। यह इस चरण में त्रुटि है, लेकिन मुझे त्रुटियां मिलती हैं जिन्हें मैं संतुलित करने में कामयाब रहा हूं जैसे balanta_id शून्य नहीं हो सकता है, या प्रबंधन_form के साथ छेड़छाड़ करने के बारे में कुछ नहीं।

मैं ड्रॉप-डाउन से चुनने वाली तारीख के आधार पर कंटुरी फॉर्मेट को सहेजना चाहता हूं (तारीख प्रीपोप्टेड है लेकिन मैं इसे हाथ से भी दर्ज कर सकता हूं) और बाद में विकास में मैं एक jquery जोड़ने की कोशिश करूंगा फॉर्म में अधिक कंटूर फ़ील्ड जोड़ने के लिए और इसके बाद डेटाबेस में सभी फॉर्मेट को सहेजने के लिए, लेकिन यह मेरी समस्या से बहुत दूर है।

आपको बहुत बहुत धन्यवाद!

उत्तर

3

इसे जांचें: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets यह वास्तव में विदेशी कुंजी उपयोग केस से संबंधित है जो आपको पूरी तरह से फिट करना चाहिए।

आपको अपने जैसे cleaned_data पर पुनरावृत्ति नहीं करना चाहिए, एक साधारण form.save() इसे करना चाहिए। साथ ही, यह मुझे अजीब लगता है कि आप टेम्पलेट में फॉर्मेट के बजाय फ़ॉर्म पर फिर से प्रयास करेंगे। मैं सुपर नींद एटीएम हूँ, तो मुझे पता नहीं। और जब आपका फॉर्म वैध नहीं है तो आपका कोड प्रतिक्रिया नहीं देता है। इसके लिए आपको 500 त्रुटि मिलेगी।

असल में आपको बलंत मॉडल के लिए एक फॉर्म और दूसरे के लिए एक इनलाइन फॉर्मेट का उपयोग करना चाहिए। फिर आप दो भागों में सत्यापन कर सकते हैं: if formset is valid ... और if form is valid. ..

+0

धन्यवाद! तो मुझे 2 अलग-अलग ifs में सत्यापन करना चाहिए? – Kaigara

+0

मैंने इसे आदमी किया, तुम चट्टान! मैं आपके उत्तर के आधार पर डेटाबेस में दोनों रूपों/स्वरूपों के लिए डेटा को सहेजने का प्रबंधन करता हूं।^- ^ – Kaigara