2012-04-25 42 views
1

定製.save()如果我創建使用modelformset_factory這樣一個formset:Django的 - 創造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(),因爲我採取formset中的每個表單並對其執行form.save(commit = False)。儘管如此,在我看來這很容易,因爲我需要訪問配方對象。

+0

你有什麼需要自定義的保存()方法? – RotaJota 2012-04-25 19:22:44

+0

我想要處理自定義成分字段,以便它可以檢索成分(如果成分已存在),或者創建一個新成分(如果它尚不存在)。那麼計劃是根據這些回報創建一個外鍵關係。 – bento 2012-04-25 19:29:39

回答

1

我不確定覆蓋BaseModelForm上現有的save()方法的最佳方法。我的猜測是,你居然會想要麼:

  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. 使用保存(提交= FALSE)在Formset,做配料的查找/創建,然後提交之後

+0

謝謝。我考慮過第二種選擇,但寧願保持我的觀點更清潔。不過,我認爲這可能是最簡單的解決方案。 – bento 2012-04-25 20:02:49

相關問題