2011-05-14 15 views
5

Veritabanına bir form kümesi kaydetmede zor zamanlar yaşıyorum.Django: İki modele dayalı bir form kümesi nasıl kaydedilir

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) 

sonraki i forms.py yapılan

models.py: Diğer bir ForeignKey sahip (Django yönetici sayfasında Balanta modeli için bazı girişleri yapılmış) bir 2 model var:

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 

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

ve şablon:

I (Balanta modeline yabancı anahtarla) Conturi modelinde alanları ile bir formset bir form var yönetmek
<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> 

ve Balanta modelinde ama alanının altında Gönder tuşuna basarken KeyError 'data' alırım. Bu, bu adımdaki hatadır, ancak balanta_id gibi üstesinden gelmeyi başaramadığım hatalar, null olamayacağı veya management_form ile kurcalamayacağınız bir şeyle karşılaştığım hatalar oluyor.

Conturi form setini, açılır listeden seçtiğim tarihe göre kaydetmek istiyorum (tarih önceden doldurulmuş, ancak el ile de girebiliyorum) ve daha sonra geliştirmeye bir jquery eklemeye çalışacağım Formda daha fazla Conturi alanı eklemek ve daha sonra veritabanındaki tüm formları kaydetmek için ama waaaaaaay sorunumdan çok uzak.

Çok teşekkür ederim!

cevap

3

Şunlara dikkat edin: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets Bu, size tam olarak uyması gereken yabancı tuşların kullanılmasıyla ilgili işlemleri basitleştirir.

Yaptığınız gibi clean_data üzerinde yinelememelisiniz, basit bir form.save() yapmalıdır. Ayrıca, şablondaki form kümesi yerine form üzerinde yinelemeniz garip geliyor. Süper uykulu atm, bu yüzden bilmiyorum. Ve formunuz geçerli olmadığında kodunuz yanıt vermiyor. Bunun için 500 hata alacaksınız.

Temel olarak Balanta modeli için bir form ve diğeri için satır içi form kümesi kullanmalısınız. Sonra doğrulama iki bölümden gerçekleştirebilirsiniz: if formset is valid ... ve if form is valid. ..

+0

Teşekkürler! Yani doğrulama işlemini 2 ayrı ifşa yapmalı mıyım? – Kaigara

+0

Ben yaptım adam, sen salla! Veritabanındaki her iki form/form kümesi için verileri yanıtınıza göre kaydetmeyi başarabilirim.^- ^ – Kaigara

İlgili konular