2011-01-13 20 views
1

私のmodelformには、カテゴリオブジェクトに対するクエリセットを持つModelMultipleChoiceFieldのフィールドがあります。フォームの送信は問題ですが、カテゴリデータは保存されません。思考?Django:ModelMultipleChoiceFieldはデータを保存しません

多くの感謝!

フォーム:

class MealForm(forms.ModelForm): 
    class Meta: 
    model = Meal 
    fields = ('category','date','time') 

    category = forms.ModelMultipleChoiceField(
     label=_("Food style"), 
     queryset=Category.objects.all(), 
            required=True) 

ビュー

@login_required 
def new_meal(request, template_name="meal/newmeal.html"): 

    if request.method == 'POST': 
    form = MealForm(request.POST) 
    form.mom = request.user 
    if form.is_valid(): 
     meal = form.save(commit=False) 
     meal.mom = request.user 
     meal.save() 
     return HttpResponseRedirect('/meal/%d' % meal.id) 
    else: 
    form = MealForm() 

    data = { 
    'form': form, 
    'add': True 
    } 

モデル:

class Category(models.Model): 

    name = models.CharField(default='',max_length=100) 
    num_tags = models.IntegerField(default=0) 

    def __unicode__(self): 
      return "%s" % self.name 
    class Meta: 
    ordering = ['name'] 

class Meal(models.Model): 
    category = models.ManyToManyField(Category) 

答えて

8

あなたが使用する必要がありますmymodelform.save_m2m()commit=FalseModelFormにすると、IDなしでm2m関係を保存できないため(別名save(commit=True))、

親モデルが最初に保存されない場合、中間テーブル(m2m)には参照するIDがありません!

http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method

@login_required 
def new_meal(request, template_name="meal/newmeal.html"): 

    if request.method == 'POST': 
    form = MealForm(request.POST) 
    form.mom = request.user 
    if form.is_valid(): 
     meal = form.save(commit=False) 
     meal.mom = request.user 
     meal.save() 
     form.save_m2m() # save m2m after meal has id 

     return HttpResponseRedirect('/meal/%d' % meal.id) 
    else: 
    form = MealForm() 

    data = { 
    'form': form, 
    'add': True 
    } 
+0

ああthanks..theカテゴリは、私は偶然にコピーエラーが発生しました。削除されました。 – Emile

+0

ああ、私は私の答えを更新します..コミット= Falseで、m2mはモデル上にIDなしで保存することができないからです。 –

+0

ありがとう!うまくいった – Emile

関連する問題