我的第一个建议是采用一种简单的方法:保存Recipe
和RecipeIngredient
,然后Recipe
在制作时将结果用作您的实例FormSet
。您可能想在配方中添加一个“已审核”布尔字段,以指示表单集是否随后被用户批准。
但是,如果您出于某种原因不想走这条路,则应该能够像这样填充表单集:
我们假设您已将文本数据解析为配方成分,并具有像这样的字典列表:
recipe_ingredients = [
{
'ingredient': 2,
'quantity': 7,
'unit': 1
},
{
'ingredient': 3,
'quantity': 5,
'unit': 2
},
]
“成分”和“单位”字段中的数字是各个成分和度量对象的主键值。我认为您已经制定了某种方法来将文本与数据库中的成分匹配,或创建新的成分。
然后,您可以执行以下操作:
RecipeFormset = inlineformset_factory(
Recipe,
RecipeIngredient,
extra=len(recipe_ingredients),
can_delete=False)
formset = RecipeFormset()
for subform, data in zip(formset.forms, recipe_ingredients):
subform.initial = data
return render_to_response('recipes/form_recipe.html', {
'form': form,
'formset': formset,
})
这initial
会将表单集中每个表单的属性设置为recipe_ingredients
列表中的字典。在显示表单集方面,这似乎对我有用,但是我还没有尝试保存。