Django:如何基于两个模型保存formset

Kai*_*ara 5 python django formset

我很难将一个formset保存到数据库中.我有两个模型,一个有一个ForeignKey到另一个(我在Django管理页面中为Balanta模型做了一些条目):

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)
Run Code Online (Sandbox Code Playgroud)

接下来我做了一个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
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

模板:

<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>
Run Code Online (Sandbox Code Playgroud)

我设法有一个表格,其中包含Conturi模型中的字段(Balanta模型的外键)和Balanta模型中的字段,但是当我按下提交时,我得到KeyError'数据'.这是这一步的错误,但我得到的错误,我设法克服,如balanta_id不能为null,或篡改management_form的东西.

我想根据我从下拉列表中选择的日期保存Conturi formset(日期是预先填充的,但我也可以手动输入),稍后在开发中我会尝试添加一个jquery来添加更多Conturi表单中的字段以及之后保存数据库中的所有表单集,但它离我的问题太远了.

非常感谢你!

Uku*_*kit 4

看看这个: http: //docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets 这确实简化了相关的外键用例,应该完全适合您。

您不应该像您那样迭代 clean_data ,一个简单的 form.save() 应该可以做到这一点。另外,令我感到奇怪的是,您会迭代表单而不是模板中的表单集。我非常困,所以我不知道。当表单集无效时,您的代码不会返回响应。您将收到 500 错误。

基本上,您应该为 Balanta 模型使用一个表单,为另一个模型使用内联表单集。然后您可以分两部分进行验证:if formset is valid...和if form is valid...