更新表单 - 使用formsets - 在运行时之前未知的初始值

时间:2011-05-30 19:53:30

标签: django forms

我是python和Django的新手,并且有一个关于如何更新具有相同类型的多个字段的f表单的简单问题:我一直在尝试使用formsets:

我有一个存储类别的简单模型:

class Category(BaseModel):
   categoryText = db.StringProperty()
   parentCat = db.IntegerProperty()

我想创建一个表单,在输入字段中显示所有可用的类别,以便对它们进行全部编辑:

使用formsets显示相同类型的多行:

编辑:

想通了:

我必须创建一个字典项列表

categories = Category.objects.all()
initialStuff = []
oneFormV={}
for cat in categories:
    oneFormV.clear()
    oneFormV["categoryText"]=cat.categoryText
    oneFormV["parentCat"]=str(cat.parentCat)
    oneFormV["catID"]=str(cat.key().id())
    initialStuff.append(oneFormV.copy()) 


def showCategories(request):
    if request.POST:
       # code to update db
    else:
       categories = Category.objects.all()
       initialStuff = []
       for cat in categories:
         initialStuff += "'categoryText':u'" + cat.categoryText +"'," + "'parentCat':u'" + str(cat.parentCat) +"'," + "'catID':u'" + str(cat.key().id()) + "'"

       initialStuff =  initialStuff [:-1] # remove last comma
       CategoryFormSet = formset_factory(CategoryForm,extra=categories.count()) 
       formset = CategoryFormSet(initial= initialStuff )

       return render_to_response('adminCategories.html', {'formset': formset})

我在填充初始数据时遇到问题。当我在循环中生成时,它会给我错误:

class CategoryForm(forms.Form):
    categoryText = forms.CharField()
    parentCat = forms.CharField()
    catID = forms.CharField()

我假设我需要存储字段的ID来更新它们!

最后我的问题:

1)我这样做是对还是有更简单的方法来实现这个目标?

2)我的问题是将初始值传递给一个初始值未知的formset,直到运行时。

3)我应该忘记formset,并通过 init 在表单中添加字段来完成此操作吗?

4)在formset中初始化表单字段的正确方法是什么?

AM

1 个答案:

答案 0 :(得分:1)

initialStuff必须是dicts列表,而不是字符串列表:

for cat in categories:    
  initialStuff.append( { categoryText: cat.categoryText,
  ...
     }
  )

所以,不要删除最后一个逗号。

如果你使用 + = 操作列表和str你得到一个字符串列表(每个str的长度为1)。

请查看下一个:http://docs.djangoproject.com/en/dev/topics/forms/formsets/#using-initial-data-with-a-formset