2011-01-13 15 views
1

Meine Modellform hat ein Feld mit einem ModelMultipleChoiceField, das ein Abfrage-Set zu einem Category-Objekt hat. Das Problem ist, dass die Form übermittelt wird, aber die Category-Daten werden nicht gespeichert. Gedanken?Django: ModelMultipleChoiceField speichert keine Daten

Vielen Dank!

Form:

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

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

Ansicht

@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 
    } 

Modelle:

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) 

Antwort

8

Sie müssenverwenden 0, wenn Sie commit=False auf Ihrem ModelForm tun, weil m2m Beziehungen nicht ohne eine ID gespeichert werden können (aka save(commit=True)).

Eine Zwischentabelle (m2m) hat keine ID für die Referenz, wenn das übergeordnete Modell nicht zuerst gespeichert wird!

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

Ah thanks..the Kategorien war ein Fehler, den ich in versehentlich kopiert. Entfernt. – Emile

+0

ah, dann werde ich meine Antwort aktualisieren .. es ist, weil Sie commit = False tun und m2m kann nicht gespeichert werden ohne eine ID auf Modell –

+0

Danke Yuji! Arbeitete super – Emile

Verwandte Themen