表单创建后的Django ModelForm实例化

时间:2011-01-18 19:46:27

标签: django django-forms

我有一个表单,其中包含对另一个模型中每个条目的响应。在生成表单时,对每个项目的响应可能存在也可能不存在。我需要一个表单,允许我更新响应(如果它存在)并使用表单发布数据创建它(如果它不存在)。

目前,我正在迭代一个范围并使用帖子数据创建我的表单:

forms = [SpecialNoteForm(request.POST, prefix=str(x), ) for x in rang(1,3)]

我这样做是因为我不知道如何干净地访问表单数据以识别应该实例化表单的对象。在创建表单列表后,我尝试执行类似的操作,因为我可以访问表单数据:

for form in forms:
            try:
                instance = SpecialNote.objects.get(flag=form["flag"].data, host=form["host"].data)
                form.instance = instance
                form.save()

然而,在我这样做之后,表单上的错误仍然存​​在。我需要一种方法来访问在表单创建时实例化对象所需的数据,或者在我将实例附加到表单后重新评估表单的方法。

修改

我遇到了与模型表单集相同的问题,就像我使用我的初始方法一样 - 我不知道如何实例化表单,同时允许在没有实例的表单上使用初始值。我不希望事先创建所有模型实例,因为无论用户是否已提交填写了必填字段的内容,它都是导入的。

我目前的做法仍然是使用模型表格:

forms = []
for n in form_range(request.POST): # calculates number of forms based on post data
    try:
        instance = SpecialNote.objects.get(flag=request.POST.get('%s'%n+'-flag'), host=request.POST.get('%s'%n+'-host'))
    except:
        instance = None
    forms.append(SpecialNoteForm(request.POST, prefix=str(n), instance=instance))
    for form in forms:
        if form.is_valid():
            form.save()

总之,formset的问题是我不知道如何正确地实例化表单而不使它们具有可查询性,即已经在数据库中。使用常规模型表单和前缀的问题是获取我需要实例化它们的对象是混乱的(从我当前的方法可以看出)。我正在寻找解决这两个问题的方法。

1 个答案:

答案 0 :(得分:0)

一个页面上的多个相同的模型表单是model formsets的用途。他们应该处理所有这些问题。