2011-05-14 35 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模型領域的表單集(與外鍵巴蘭塔模型)和巴蘭塔模型,但是當現場下方我按提交我得到KeyError的'數據'。這是這一步的錯誤,但我得到的錯誤,我設法克服像balanta_id不能爲空,或有關篡改management_form。

我想保存基於我從下拉選擇的日期Conturi formset(日期預填充,但我也可以手動輸入它)和後來在開發中我會嘗試添加一個jQuery在表單中添加更多的Conturi字段,然後將所有的表單集保存到數據庫中,但是它的waaaaaaay離我的問題太遠了。

非常感謝!

回答

3

查看: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets 這真的簡化了與外鍵密切相關的用例,它應該完全適合您。

你不應該像你這樣迭代clean_data,一個簡單的form.save()應該這樣做。另外,它讓我感到奇怪,你會遍歷模板中的表單而不是模板中的表單集。我很睏倦atm,所以我不知道。並且當formset無效時,您的代碼不會返回響應。你會得到500的錯誤。

基本上,您應該使用Balanta模型的表單和另一個的內聯表單。然後您可以執行驗證分爲兩部分:if formset is valid ...和if form is valid. ..

+0

謝謝!所以我應該在兩個單獨的ifs中進行驗證? – Kaigara 2011-05-17 17:44:08

+0

我做到了男人,你搖滾!根據您的答案,我設法將兩種表單/表單集的數據保存在數據庫中。^- ^ – Kaigara 2011-05-17 19:58:15

相關問題