2017-06-03 10 views
1

中間モデルにデータを保存し、モデル保存をオーバーライドすることでモデル内で計算を行います。私が持っている問題は、中間モデルに保存することができないフォームセットである。 中間モデルを介してmanytomanyを持つDjangoフォームセット

仲介モデル

は、M2Mの関係が(それは私が推測理解しています)がある場合にのみ作成されます。

は、私はそうのような4つのモデルを持っている:

Category(models.Model): 
    name = models.CharField(..) 

Tax(models.Model): 
    name = models.CharField(..) 
    rate = models.DecimalField(..) 

CategoryItem(models.Model): 
    category = models.ForeignKey(Category) 
    taxes = models.ManyToManyField(Tax, through='CategoryItemTax', through_fields=('item', 'tax')) 
    quantity = models.DecimalField(..) 
    price = models.DecimalField(..) 

# intermediary model below 
CategoryItemTax(models.Model): 
    category = models.ForeignKey(Category) 
    tax = models.ForeignKey(Tax) 
    item = models.ForeignKey(CategoryItem) 
    rate = models.DecimalField(..) #derived from tax object in the model 
    total_tax = models.DecimalField(..) #calculated in model save 

私の私はCategoryItemフォームセットを持つカテゴリーモデルのフォームを持っています。

Cannot set values on a ManyToManyField which specifies an intermediary model. 
Use category.CategoryItemTax's Manager instead 
+0

formsetを表示できますか? – zaidfazil

+0

私はforms.pyコードを追加しました。 – Hdman

答えて

0

編集このようなあなたのビュー、

def form_valid(self, form, formset): 
    self.object = form.save() 
    formset.instance = self.object 
    instances = formset.save(commit=False) 
    for each in instances: 
     each.category = self.object 
     each.save() 
     item = CategoryItemTax.objects.create(category=self.object, item=each) 
     item.save() 

class CategoryForm(forms.ModelForm): 

    class Meta: 
     model = Category 

class CategoryItemForm(forms.ModelForm) 
    class Meta: 
     model = CategoryItem 

CategoryItemFormSet = inlineformset_factory(Category, CategoryItem, form=CategoryItemForm, extra=1) 

残念ながら、私は以下のエラーを取得し、以下のよう

class FormsetMixin(object): 
    object = None 

    def post(self, request, *args, **kwargs): 
     if getattr(self, 'is_update_view', False): 
      self.object = self.get_object() 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     formset_class = self.get_formset_class() 
     formset = self.get_formset(formset_class) 
     if form.is_valid() and formset.is_valid(): 
      return self.form_valid(form, formset) 
     else: 
      return self.form_invalid(form, formset) 

    # THE SAVE METHOD 
    def form_valid(self, form, formset): 
     self.object = form.save() 
     formset.instance = self.object 
     instances = formset.save(commit=False) 
     for i in instances: 
      CategoryItemTax.objects.create(category=self.object, item=i, tax=i) 
      CategoryItemTax.save() 

class CategoryCreateView(FormsetMixin, CreateView): 
    template_name='..' 
    model = Category 
    form_class = CategoryForm 
    formset_class = CategoryItemFormSet 

Forms.py:以下のように私のviews.py

多対多関連オブジェクト最初に保存して、別のインスタンスに関連付けることができます。

+0

'仲介モデルを指定するManyToManyFieldに値を設定できません。代わりにcategory.CategoryItemTaxのマネージャを使用してください。 " - これは表示され続けるエラーです。 – Hdman

+0

このビューにTaxオブジェクトが登録されていないことを理解する必要があります。多対多の関係を作成するためには、TaxItオブジェクトとCategoryItemオブジェクトが必要です。あなたがここで成し遂げようとしていることを説明するなら、多分もっと助けてもらえるかもしれません。 – zaidfazil

+0

それは単純な請求書発行のアプリケーションで、各カテゴリ項目(行項目)に複数の税金を追加することができます。 – Hdman

関連する問題