2012-04-25 5 views
1

用)(カスタム.SAVEを作成:ジャンゴ - 私はこのようなmodelformset_factory使用してフォームセットを作成する場合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を行うことができるようになると思います)、与えられたそのIフォームセット内の各フォームを取り出し、form.save(commit = False)を実行します。レシピオブジェクトへのアクセスが必要だったので、私の見解ではそれを行うのは簡単でした。

+0

コミット? – RotaJota

+0

私はカスタム成分のフィールドを処理して、すでに存在する場合は成分を取り出すか、成分が存在しない場合は新しい成分を作ります。次に、それらのリターンに基づいて外部キーの関係を作成する予定です。 – bento

答えて

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. 使用して、フォームセットに(偽=コミット)セーブ成分検索/作成を行い、その後、あなたがのために()メソッドの保存カスタムを何が必要なのか、その後

+0

ありがとうございます。私は第二の選択肢を考えていましたが、私の見解をちょっときれいに保つことを好みました。私はこれがおそらく最も簡単な解決策だと思う。 – bento