Python Django内联表单集的初始数据

Python Django内联表单集的初始数据,python,django,forms,inline-formset,Python,Django,Forms,Inline Formset,我已经整理了一张表格来保存一份食谱。它使用表单和内联表单集。我有一些用户使用包含食谱的文本文件,他们希望剪切和粘贴数据,以便于输入。我已经解决了如何在处理原始文本输入后填充表单部分,但我无法解决如何填充内联表单集 看起来解决方案差不多已经在这里详细说明了:但我不能把这些部分放在一起 我的模型: #models.py from django.db import models class Ingredient(models.Model): title = models.CharField

我已经整理了一张表格来保存一份食谱。它使用表单和内联表单集。我有一些用户使用包含食谱的文本文件,他们希望剪切和粘贴数据,以便于输入。我已经解决了如何在处理原始文本输入后填充表单部分,但我无法解决如何填充内联表单集

看起来解决方案差不多已经在这里详细说明了:但我不能把这些部分放在一起

我的模型:

#models.py

from django.db import models

class Ingredient(models.Model):
    title = models.CharField(max_length=100, unique=True)

    class Meta:
        ordering = ['title']

    def __unicode__(self):
        return self.title

    def get_absolute_url(self):
        return self.id

class Recipe(models.Model):
    title = models.CharField(max_length=255)
    description = models.TextField(blank=True)
    directions = models.TextField()

    class Meta:
        ordering = ['title']

    def __unicode__(self):
        return self.id

    def get_absolute_url(self):
        return "/recipes/%s/" % self.id

class UnitOfMeasure(models.Model):
    title = models.CharField(max_length=10, unique=True)

    class Meta:
        ordering = ['title']

    def __unicode__(self):
        return self.title

    def get_absolute_url(self):
        return self.id

class RecipeIngredient(models.Model):
    quantity = models.DecimalField(max_digits=5, decimal_places=3)
    unit_of_measure = models.ForeignKey(UnitOfMeasure)
    ingredient = models.ForeignKey(Ingredient)
    recipe = models.ForeignKey(Recipe)

    def __unicode__(self):
        return self.id
配方表单是使用ModelForm创建的:

class AddRecipeForm(ModelForm):
    class Meta:
        model = Recipe
        extra = 0
以及视图中的相关代码(删除解析表单输入的调用):

如上所述,FormSet()为空时,我可以成功启动页面。我已经尝试了几种方法来输入我确定的数量、计量单位和成分,包括:

  • 设置初始数据,但这不适用于内联表单集
  • 传递字典,但会生成管理表单错误
  • 玩了init,但我有点不知所措

非常感谢您的建议。

我的第一个建议是采取简单的方法:保存
配方
RecipeCredit
s,然后在制作
表单集
时使用生成的
配方
。您可能希望在配方中添加一个“已审核”布尔字段,以指示用户是否批准了表单集

但是,如果您不想因为任何原因走这条路,您应该能够像这样填充表单集:

我们假设您已将文本数据解析为配方成分,并有一个类似以下的词典列表:

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\u components
列表中的字典。就显示表单集而言,它似乎对我有用,但我还没有尝试保存。

我无法让Aram Dulyan代码在这方面起作用

for subform, data in zip(formset.forms, recipe_ingredients):
    subform.initial = data
显然django 1.8上发生了一些变化,我无法迭代缓存的_属性

表单-django.utils.functional.cached_属性对象,位于0x7efda9ef9080

我犯了这个错误

zip参数#1必须支持迭代

但我仍然使用字典并将其直接分配给我的表单集,它起了作用,我从这里举了一个例子:

从django.forms导入formset_工厂 从myapp.forms导入ArticleForm

ArticleFormSet = formset_factory(ArticleForm, can_order=True)
formset = ArticleFormSet(initial=[
    {'title': 'Article #1', 'pub_date': datetime.date(2008, 5, 10)},
    {'title': 'Article #2', 'pub_date': datetime.date(2008, 5, 11)},
])
“将表单集指定给模板”上的我的代码

return self.render_to_response(
self.get_context_data(form=form, inputvalue_numeric_formset=my_formset(initial=formset_dict)

很好的建议,阿兰,非常感谢。今天我将尝试这些选项。我特别喜欢有一个简单的选择…使用zip肯定有效,我可以确认,以通常的方式保存表单也有效。正如您所指出的,我仍然需要将解析的文本与相关的成分和度量对象的单位进行匹配,但我认为这应该是可以管理的。很好的解决方案。是的,是的。这是一个伟大的解决方案!我很难做到这一点。我首先研究如何构建集合中的每个表单。然后,在表单(而不是表单集)的基础上,实现了initial的工作。在我们信任的地方™选择2无疑是实现这一目标的最佳方式。谢谢。真是聪明的解决方案@Aram Dulyan。这真的解决了我的问题。谢谢。
return self.render_to_response(
self.get_context_data(form=form, inputvalue_numeric_formset=my_formset(initial=formset_dict)