5

フォームセットをデータベースに保存するのに苦労しています。2 つのモデルがあり、一方は他方への 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)

次に、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 モデルのフィールド (Balanta モデルへの外部キーを持つ) と Balanta モデルのフィールドの下にあるフォームセットであるフォームを持つことができましたが、送信を押すと KeyError 'data' が表示されます。これはこのステップでのエラーですが、balanta_id を null にすることはできない、または management_form の改ざんに関するエラーなど、なんとか克服できたエラーが発生します。

ドロップダウンから選択している日付に基づいて Conturi フォームセットを保存したい (日付は事前に入力されていますが、手動で入力することもできます)。開発の後半で、さらに Conturi を追加するために jquery を追加しようとします。フォームのフィールドとその後、すべてのフォームセットをデータベースに保存しますが、それは私の問題とはかけ離れています。

どうもありがとうございます!

4

1 に答える 1

3

これをチェックしてください:http: //docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets これは、あなたに完全に適合するはずの外部キーによる関連するユースケースを本当に単純化します。

単純な form.save() で行う必要があります。また、テンプレートのフォームセットではなくフォームを反復処理するのは奇妙に思えます。私はとても眠いので、わかりません。また、フォームセットが有効でない場合、コードは応答を返しません。そのために500エラーが発生します。

基本的に、Balanta モデルにはフォームを使用し、もう一方のモデルにはインライン フォームセットを使用する必要があります。その後、次の 2 つの部分で検証を実行できます: if formset is valid... とif form is valid...

于 2011-05-14T22:08:11.933 に答える