Django - форма, делающая один родительский объект и несколько дочерних объектов
Я пытаюсь сделать форму на основе модели Django, которая позволит создать две модели, одна из которых будет передаваться как внешний ключ второй.
models.py
class Recipe(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Ingredient(models.Model):
name = models.CharField(max_length=200)
quantity = models.CharField(max_length=200)
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
def __str__(self):
return self.name
формы
class IngredientForm(ModelForm):
class Meta:
model = Ingredient
fields = ['name', 'quantity']
class RecipeForm(ModelForm):
class Meta:
model = Recipe
fields = ['name']
и views.py ---- вот в чем проблема
def new_recipe_create_view(request, *args, **kwargs):
context = {}
created_recipe = None
form = RecipeForm()
if request.method == 'POST':
form = RecipeForm(request.POST)
if form.is_valid():
print("recipe successfully created")
form.save()
name = form.data['name']
created_recipe = Recipe.objects.filter(name=name).last()
#new recipe is being made correctly
IngredientFormSet = inlineformset_factory(Recipe, Ingredient, fields=('name', 'quantity'), extra=3, max_num=10, labels = {
'name': (''),
'quantity': (''),
})
if request.method == 'POST':
formset = IngredientFormSet(request.POST, instance=created_recipe)
if formset.is_valid():
formset.save()
else:
print("formset is not valid") # <------------------------------------------
else:
formset = IngredientFormSet( instance=created_recipe)
if form.is_valid() and formset.is_valid():
return redirect('index')
context['formset'] = formset
context['form'] = form
return render(request, 'recipes/create_recipe.html', context)
часть с inlineformset_factory, я сделал следующие документы: https://docs.djangoproject.com/en/4.1/topics/forms/modelforms/#inline-formsets
Глава: Использование встроенного набора форм в представлении
но это не работает -> formset.is_valid() возвращает False Где проблема?
Похоже, что вам не хватает {{formset.management_form}}
в шаблоне HTML.
поместите это в качестве дочернего тега формы.
<form ...>
{{form...}}
{{formset..}}
{{formset.management_form}}
</form>