Kickasstimus
Kickasstimus

Reputation: 197

My form with a ModelMultipleChoiceField is not saving data.

In the admin panel, I can add Persons to my CompleteClass model. There is a M2M relationship between CompleteClass and Person. But, my form doesn't work as it should. The pub_date will update, and I can save the head_count, but not the ModelMultipleChoiceField (persons) -- it will not save.

models.py

class Person(models.Model):
    name = models.CharField(max_length=255)
    persona_description = models.CharField(max_length=255)
    def __str__(self):
        return self.name

class CompleteClass(models.Model):
    persons = models.ManyToManyField(Person)
    class_name = models.CharField(max_length=255)
    class_head_count = models.IntegerField()
    class_pub_date = models.DateField()

    def __str__(self):
        return '%s %s' % (self.class_name, self.class_head_count)

    def save_complete_class(self):
        self.class_pub_date = timezone.now()
        self.save()

    class Meta:
        ordering = ('class_pub_date',)

Here is views.py:

def class_new(request):
    if request.method == "POST":
        form = CompleteClassForm(request.POST)
        if form.is_valid():
            complete_class = form.save(commit=False)
            complete_class.class_pub_date = timezone.now()
            complete_class.save()
            form.save_m2m()
            return redirect('class_detail', pk=complete_class.pk)
    else:
        form = CompleteClassForm()
    return render(request, 'app/class_edit.html', {'form': form})

and forms.py

class CompleteClassForm(forms.ModelForm):
    class Meta:
        model = CompleteClass
        fields = ('class_name', 'class_head_count',)
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(CompleteClassForm, self).__init__(*args, **kwargs)
        self.fields['class_persons']=forms.ModelMultipleChoiceField(queryset=Person.objects.all())

I've read through the documentation and used the save_m2m since i've set commit=false.

The POST data contains person data, but it's not being written to the database. I'm stumped. Please help!

Upvotes: 0

Views: 627

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599490

Only fields named in the fields tuple are saved to the instance. You don't have your m2m field listed there.

You also define your modelchoicefield with a different name - class_persons instead of persons. In fact, there is no reason to define that field separately at all - you haven't changed any of the attributes from the defaults.

And once you've removed that definition, there ​is also no reason to override __init__, seeing as you never pass the user parameter nor do you use it anywhere in the form.

Upvotes: 1

Related Questions