1

如果我像这样使用 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()

顺便说一句,我认为这种方法还允许我执行自定义 .save(),因为我在表单集中获取每个表单并对其执行 form.save(commit= False)。不过,在我看来,这样做更容易,因为我需要访问配方对象。

4

1 回答 1

1

我不确定覆盖save()BaseModelForm 上现有方法的最佳方法。我的猜测是你实际上想要:

  1. 创建您自己的字段,该字段具有自己的to_python()方法,该方法将获取文本并查找/创建关联的对象。

    class IngredientField(forms.CharField):
        def to_python(self, value):
            # Lookup model or create new one
            ingredient = models.Ingredient.objects.get(name=value)
            if not ingredient:
                ingredient = models.Ingredient.create(name=value)
            return ingredient
    
  2. 在表单集上使用 save(commit=False),进行成分查找/创建,然后提交

于 2012-04-25T19:52:21.950 回答