gpt4 book ai didi

python - Django:如何保存基于两个模型的表单集

转载 作者:太空狗 更新时间:2023-10-30 01:24:08 30 4
gpt4 key购买 nike

我在将表单集保存到数据库时遇到困难。我有 2 个模型,一个有一个 ForeignKey 到另一个(我在 Django 管理页面中为 Balanta 模型创建了一些条目):

模型.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“数据”。这是此步骤中的错误,但我遇到了我设法克服的错误,例如 balanta_id 不能为空,或者有关篡改 management_form 的问题。

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

非常感谢!

最佳答案

检查一下: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets这确实简化了应该非常适合您的外键关联用例。

您不应该像现在这样遍历 cleaned_data,一个简单的 form.save() 应该可以做到。此外,令我感到奇怪的是,您将遍历表单而不是模板中的表单集。我 super 困,所以我不知道。当表单集无效时,您的代码不会返回响应。你会得到一个 500 错误。

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

关于python - Django:如何保存基于两个模型的表单集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6003984/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com