Esse não tópico não é de uma dúvida e sim de um aprendizado que é interessante deixar no grupo para caso de dúvidas posteriores, eu tivesse essa dúvida e só conseguir resolver quando fui ao código fonte do django.
Quando você tem um ModelForm que tem um campo M2M se na sua view quando você chamar o save do form passar como parâmetro do commit o valor False:
form.save(commit=False)
O django cria uma função chamada de save_m2m no form para que você possa salvar o relacionamento m2m. Isso é muito interessante pois quando você faz commit=False e depois usa a instancia do model assim:
instance = form.save(commit=False)
#..... alguma coisa ....
instance.save()
O m2m não é salvo, ai você teria que varrer a queryset m2m do seu Model, retirando os que não foram selecionados pelo usuário e adicionando os novos que foram selecionados (form.cleaned_data["campo_m2m"])
Caso este tipo de tópico não seja bem vindo me avisem que eu não posto mais, apenas postei porque achei fantástico o Django ter pensado nisso, poupa muito trabalho.
--
Gileno Filho, Web Developer