我有以下型号: 物体B包含的物体C,由物体A包含
我在模板中有一个动态表单,并且使用jQuery函数,我可以动态地向这个表单添加几个字段,每组字段代表对象(B或C)
当通过帖子操作提交时,我想创建我的对象树。 我的目标是在验证此模板时创建对象树。
目前它有效,但我想我的解决方案真的很脏:
我非常确定这是一个更好的解决方案:p
非常感谢 - 为了清晰而编辑
编辑:
注意: 我的数据模型不同(之前简化过) 所以: 会话是前“对象A” 练习是“对象B” 重复是“对象C” - 为此,我希望它足够清楚(我会在最后的帖子中更正)
这里有一些进展,有你的帮助人:)我和Form和FormSet玩了一下。显然,它的强大功能:))
所以现在我有以下观点:
class RepetitionForm(forms.Form):
weight = forms.CharField()
count = forms.CharField()
def workoutForm(request):
RepetitionFormSet = formset_factory(RepetitionForm, extra=1)
if request.method == 'POST':
repetitionFormSet = RepetitionFormSet(request.POST)
user = get_object_or_404(User, pk=1)
session = Session(date=datetime.date.today(), user=user)
session.save()
exerciseTypeRef = get_object_or_404(ExerciseTypeRef, pk=1)
exercise = Exercise(session = session, exerciseTypeRef = exerciseTypeRef)
exercise.save()
if repetitionFormSet.is_valid():
for repetitionForm in repetitionFormSet.cleaned_data:
if(repetitionForm.is_valid()):
weight = repetitionForm.data['weight']
count = repetitionForm.data['count']
return HttpResponse("ok")
else:
repetitionFormSet = RepetitionFormSet()
return render_to_response('workoutForm.html', {'formSet': repetitionFormSet}, context_instance=RequestContext(request))
模板面就像:
{% csrf_token %}
{{ formSet.management_form }}
<ul id="idUlFormSet">
{% for item in formSet %}
<li>
{{ item }}
</li>
{% endfor %}
(在模板中使用了更多代码来动态添加表单实例,因为这篇聪明的帖子描述了它 Django - Javascript dynamic inline FormSet with autocomplete,我不会在这里解释一下)
目前,在提交表单时,我从视图中收到了此错误:
“钥匙'重量'未找到
如果我正在尝试
repetitionItem.isValid()
“RepetitionForm”对象没有属性'isValid'
如果我使用forms.ModelForm而不是forms.Form
,则会出现同样的问题我很困惑:p
我的模特
class User(models.Model):
name = models.CharField(max_length=100)
mail = models.CharField(max_length=100)
dateCreated = models.DateTimeField('User creation date')
def __unicode__(self):
return self.name
class Session(models.Model):
date = models.DateField('Session Date')
user = models.ForeignKey(User)
def __unicode__(self):
return self.date.strftime("%Y/%m/%d")
class ExerciseTypeRef(models.Model):
name = models.CharField(max_length=100)
desc = models.CharField(max_length=300)
def __unicode__(self):
return self.name
class Exercise(models.Model):
session = models.ForeignKey(Session)
exerciseTypeRef = models.ForeignKey(ExerciseTypeRef)
def __unicode__(self):
return self.exerciseTypeRef.name
class Repetition(models.Model):
exercise = models.ForeignKey(Exercise)
count = models.IntegerField()
weight = models.IntegerField()
答案 0 :(得分:2)
为您的“A”模型制作一个模型表单。
class FormA(forms.ModelForm) :
"""Signup Form"""
class Meta :
model = ObjectA
在您看来:
from django.forms.models import modelformset_factory
def form(request) :
# Use Modelformset_factory and exclude the FK fields
FormBSet = modelformset_factory(ObjectB, exclude=('objecta',))
FormCSet = modelformset_factory(ObjectC, exclude=('objectb',))
if request.method == "POST" :
forma = FormA(request.POST, prefix="forma")
formbset = FormBSet(request.POST, prefix="formbset")
formcset = FormCSet(request.POST, prefix="formcset")
if forma.is_valid() and formbset.is_valid() and formcset.is_valid() :
# save a
a = forma.save()
# save a into b
for formb in formbset:
b = formb.save(commit=False)
b.objecta = a
b.save()
# save b into c
for formc in formcset:
c = formc.save(commit=False)
c.objectb = b
c.save()
...
commit = False
,以便您可以保存先前保存操作中的结果对象使用from django.forms.models import modelformset_factory
NOT formset_factory,请注意排除参数。
请参阅:https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets
答案 1 :(得分:0)
立即行动!
犯了几个错误:
RepetitionFormSet = formset_factory(RepetitionForm, extra=1)
if request.method == 'POST':
repetitionFormSet = repetitionFormSet(request.POST)
#should be
repetitionFormSet = RepetitionFormSet(request.POST)
is_valid IS CRUCIAL(对象未填充!),我试图调用
repetitionForm.isValid()
哪个应该是Java函数,但在django表单对象上不存在! (愚蠢的我)
最后,有时候我在没有填充字段的情况下测试了我的代码,抛出了KeyError异常。我不确定这件事是否正常,我现在必须处理这个问题
非常感谢Francis!