24đź‘Ť
My first suggestion would be to take the simple way out: save the Recipe
and RecipeIngredient
s, then use the resulting Recipe
as your instance when making the FormSet
. You may want to add a “reviewed” boolean field to your recipes to indicate whether the formsets were then approved by the user.
However, if you don’t want to go down that road for whatever reason, you should be able to populate your formsets like this:
We’ll assume that you have parsed the text data into recipe ingredients, and have a list of dictionaries like this one:
recipe_ingredients = [
{
'ingredient': 2,
'quantity': 7,
'unit': 1
},
{
'ingredient': 3,
'quantity': 5,
'unit': 2
},
]
The numbers in the “ingredient” and “unit” fields are the primary key values for the respective ingredients and units of measure objects. I assume you have already formulated some way of matching the text to ingredients in your database, or creating new ones.
You can then do:
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,
})
This sets the initial
property of each form in the formset to a dictionary from your recipe_ingredients
list. It seems to work for me in terms of displaying the formset, but I haven’t tried saving yet.
2đź‘Ť
I couldn’t make Aram Dulyan code works on this
for subform, data in zip(formset.forms, recipe_ingredients):
subform.initial = data
Apparently something changed on django 1.8 that i can’t iterate a cached_property
forms – django.utils.functional.cached_property object at 0x7efda9ef9080
I got this error
zip argument #1 must support iteration
But i still take the dictionary and assign it directly to my formset and it worked, i took the example from here:
https://docs.djangoproject.com/en/dev/topics/forms/formsets/#understanding-the-managementform
from django.forms import formset_factory
from myapp.forms import 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)},
])
My code on assign formset to template
return self.render_to_response(
self.get_context_data(form=form, inputvalue_numeric_formset=my_formset(initial=formset_dict)
- Django Tutorial: Generic Views. Attribute Error
- How can I create a case-insensitive database index in Django?
1đź‘Ť
I’m having no trouble passing initial
to the inline formset — not the factory method, crucially — circa Django 4.1, FWIW.
MyInlineFormSet = inlineformset_factory(ParentModel, ChildModel, ...)
formset = MyInlineFormSet(initial=[{...}])
It’s been 12+ years since the original question, so eminently possible the codebase has changed, and/or maybe I’m misreading some of the answers and comments here, but hoping this clarification might be helpful to someone on the hunt for how to do it.
- Invalid parameter server_name in /etc/nginx/sites-enabled/django
- Getting file extension in Django template
- Copying ManyToMany fields from one model instance to another
- Converting a django ValuesQuerySet to a json object