次のようにmodelformset_factoryを使用してフォームセットを作成する場合:
IngredientFormSet = modelformset_factory(RecipeIngredients, form=RecipeIngredientsForm)
formset = IngredientFormSet(request.POST)
私のフォームは次のようになります
class RecipeIngredientsForm(forms.ModelForm):
Ingredient = forms.CharField(max_length= 100)
class Meta:
model = RecipeIngredients
exclude = ('weightmetric','recipe')
カスタムの.save()メソッドはどこに配置しますか?RecipeIngredientsFormの下に置きますか?
[考えられる解決策]
あなたの見解では、次のようなことをしてください。
if formset.is_valid():
for form in formset:
obj = form.save(commit=False) #obj = RecipeIngredient model object
try:
ingredient_in_db = Ingredient.objects.get(name = form.cleaned_data.get('ingredientform'))
except:
ingredient_in_db = None
if ingredient_in_db:
obj.ingredient = ingredient_in_db
else:
new_ingredient = Ingredient.objects.create(name = form.cleaned_data.get('ingredientform'))
obj.ingredient = new_ingredient
obj.recipe = recipeobj
obj.save()
ちなみに、このメソッドでは、フォームセット内の各フォームを取得してform.save(commit = False)を実行することを考えると、カスタム.save()も実行できると思います。ただし、レシピオブジェクトにアクセスする必要があるため、自分のビューでそれを行う方が簡単でした。