# ModelForms are a much better approach, now that they exist. # However here's an fix to the above workflow: def save_presentation(request, form, user): ... # All this can be replaced with the shorthand version below # pres = Presentation.objects.create( # presenter=user, # cat = Category(form.cleaned_data['category']), # short_abstract = form.cleaned_data['short_abstract'], # title = form.cleaned_data['title'], # status = Status(name='Pending'), # ) pres = Presentation(**form.cleaned_data) pres.save() # Note: I don't know, off-hand, if the above shorthand will Just Work with the M2M field. # If not you'll need the code below too: # ModelChoiceField cleaned_data returns actual model objects # so the way to loop through and add them to an existing model is: for i in form.cleaned_data['audience_list']: pres.audience.add(i)