从ajaxpost在django视图中创建多个对象

我有以下模型:对象C包含的对象C,由对象A包含

我在模板中有一个动态表单,并且使用jQuery函数,我可以动态地向这个表单添加几个字段,每组字段代表对象(B或C)

当通过post操作提交时,我想创建我的对象树。 我的目标是在validation此模板时创建对象树。

目前它可以工作,但我想我的解决方案真的很脏:

  • 根据我在表单中有多少元素,使用js / jquery创建列表
  • 使用$ .post作为数据参数传递这些列表
  • 使用请求中的列表,在视图中的django数据模型中创建对象

我非常确定有一个更好的解决方案:p

  • 使用多个post通过不同的视图创建对象(A,B和C不同)? (但同步问题..)
  • 使用json直接在js / jquery端表示对象?
  • 另一种方法?

非常感谢 – 编辑清晰

编辑:

注意:我的数据模型在这里是不同的(我之前简化过)所以:Session是以前的“对象A”练习是“对象B”重复是“对象C” – 对此我很抱歉,我希望它足够清楚(我会在最后的post中更正)

这里有一些进展,有你的帮助人:)我用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 }} 
    {% for item in formSet %}
  • {{ item }}
  • {% endfor %}

(在模板中使用更多代码来动态添加表单实例,因为这个聪明的post描述了它Django – 带自动完成的Javascript动态内联FormSet ,我不会在这里解释)

目前,在提交表单时,我从视图中收到此错误:

“关键’重量’未找到

如果我正在尝试

 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() 

为您的“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() ... 
  1. 在视图中初始化modelForms时给它们一个前缀
  2. commit = False以便您可以保存先前保存操作中的结果对象
  3. 使用Formsets(https://docs.djangoproject.com/en/dev/topics/forms/formsets/#formsets)来管理B和C的n *个实例

编辑

使用from django.forms.models import modelformset_factory NOT formset_factory,另请注意exclude paramater。

请参阅: https : //docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets

现在工作!

犯了几个错误:

 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表单对象上不存在! (愚蠢的我)

最后,有时我在没有填充字段的情况下测试了我的代码,抛出了KeyErrorexception。 我不确定这件事是否正常,我现在必须处理这件事

非常感谢Francis!