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)