2011-01-13 57 views
1

我的模型表單有一個帶ModelMultipleChoiceField的字段,該字段包含一個查詢集到一個Category對象。問題是表單提交,但類別數據不保存。思考?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()當您在ModelForm上執行commit=False時,因爲無法在沒有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 2011-01-13 20:08:07